mirror of
https://github.com/FrankerFaceZ/FrankerFaceZ.git
synced 2025-07-28 05:28:30 +00:00
4.17.0
* Added: Support for Twitch's redesigned badges. * Added: Version selector to choose between the new vs old badge designs. * Added: Option to adjust badge colors for visibility depending on the current background color. * Changed: Use the channel accent color for the border on re-subscription messages and other notices. * Fixed: Update `dayjs` dependency for upstream i18n fixes. * Fixed: Hiding Side Navigation not functioning with a certain Twitch experiment. * Fixed: Certain player settings, such as hiding extensions, not functioning. * Maintenance: Update a few dependencies.
This commit is contained in:
parent
ff0f0ea074
commit
1fe7c417f3
14 changed files with 229 additions and 64 deletions
93
package-lock.json
generated
93
package-lock.json
generated
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "frankerfacez",
|
"name": "frankerfacez",
|
||||||
"version": "4.14.12",
|
"version": "4.17.0",
|
||||||
"lockfileVersion": 1,
|
"lockfileVersion": 1,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
@ -470,9 +470,9 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@ffz/icu-msgparser": {
|
"@ffz/icu-msgparser": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/@ffz/icu-msgparser/-/icu-msgparser-1.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/@ffz/icu-msgparser/-/icu-msgparser-1.0.2.tgz",
|
||||||
"integrity": "sha512-0+i29DZUJIqrK02rHcxDXmuLSOyp4EJERu4uQDOh7w39d5TqXHbFP2CRtSXjYYCQZWHoKwn37ZZScn+8+zH56g=="
|
"integrity": "sha512-LTtWOQ4fftxcC7Z86u9LTi1eZ4X07hQH5yvcURlYSpVTaY9dXXE/h5BdtJB0TIk7FkSiAuN/3sRkfHD0u3+S7Q=="
|
||||||
},
|
},
|
||||||
"@types/anymatch": {
|
"@types/anymatch": {
|
||||||
"version": "1.3.1",
|
"version": "1.3.1",
|
||||||
|
@ -1501,6 +1501,17 @@
|
||||||
"ssri": "^6.0.1",
|
"ssri": "^6.0.1",
|
||||||
"unique-filename": "^1.1.1",
|
"unique-filename": "^1.1.1",
|
||||||
"y18n": "^4.0.0"
|
"y18n": "^4.0.0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"rimraf": {
|
||||||
|
"version": "2.7.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
|
||||||
|
"integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"glob": "^7.1.3"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"cache-base": {
|
"cache-base": {
|
||||||
|
@ -1893,6 +1904,17 @@
|
||||||
"mkdirp": "^0.5.1",
|
"mkdirp": "^0.5.1",
|
||||||
"rimraf": "^2.5.4",
|
"rimraf": "^2.5.4",
|
||||||
"run-queue": "^1.0.0"
|
"run-queue": "^1.0.0"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"rimraf": {
|
||||||
|
"version": "2.7.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
|
||||||
|
"integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"glob": "^7.1.3"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"copy-descriptor": {
|
"copy-descriptor": {
|
||||||
|
@ -2088,9 +2110,9 @@
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"dayjs": {
|
"dayjs": {
|
||||||
"version": "1.8.15",
|
"version": "1.8.17",
|
||||||
"resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.8.15.tgz",
|
"resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.8.17.tgz",
|
||||||
"integrity": "sha512-HYHCI1nohG52B45vCQg8Re3hNDZbMroWPkhz50yaX7Lu0ATyjGsTdoYZBpjED9ar6chqTx2dmSmM8A51mojnAg=="
|
"integrity": "sha512-47VY/htqYqr9GHd7HW/h56PpQzRBSJcxIQFwqL3P20bMF/3az5c3PWdVY3LmPXFl6cQCYHL7c79b9ov+2bOBbw=="
|
||||||
},
|
},
|
||||||
"de-indent": {
|
"de-indent": {
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
|
@ -2226,6 +2248,15 @@
|
||||||
"dev": true
|
"dev": true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"rimraf": {
|
||||||
|
"version": "2.7.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
|
||||||
|
"integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"glob": "^7.1.3"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -3128,6 +3159,17 @@
|
||||||
"flatted": "^2.0.0",
|
"flatted": "^2.0.0",
|
||||||
"rimraf": "2.6.3",
|
"rimraf": "2.6.3",
|
||||||
"write": "1.0.3"
|
"write": "1.0.3"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"rimraf": {
|
||||||
|
"version": "2.6.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
|
||||||
|
"integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"glob": "^7.1.3"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"flatted": {
|
"flatted": {
|
||||||
|
@ -3822,6 +3864,17 @@
|
||||||
"inherits": "~2.0.0",
|
"inherits": "~2.0.0",
|
||||||
"mkdirp": ">=0.5 0",
|
"mkdirp": ">=0.5 0",
|
||||||
"rimraf": "2"
|
"rimraf": "2"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"rimraf": {
|
||||||
|
"version": "2.7.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
|
||||||
|
"integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"glob": "^7.1.3"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"function-bind": {
|
"function-bind": {
|
||||||
|
@ -5362,6 +5415,17 @@
|
||||||
"mkdirp": "^0.5.1",
|
"mkdirp": "^0.5.1",
|
||||||
"rimraf": "^2.5.4",
|
"rimraf": "^2.5.4",
|
||||||
"run-queue": "^1.0.3"
|
"run-queue": "^1.0.3"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"rimraf": {
|
||||||
|
"version": "2.7.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
|
||||||
|
"integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"glob": "^7.1.3"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ms": {
|
"ms": {
|
||||||
|
@ -5473,6 +5537,15 @@
|
||||||
"which": "1"
|
"which": "1"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"rimraf": {
|
||||||
|
"version": "2.7.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
|
||||||
|
"integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"glob": "^7.1.3"
|
||||||
|
}
|
||||||
|
},
|
||||||
"semver": {
|
"semver": {
|
||||||
"version": "5.3.0",
|
"version": "5.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
|
||||||
|
@ -6786,9 +6859,9 @@
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"rimraf": {
|
"rimraf": {
|
||||||
"version": "2.6.3",
|
"version": "3.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
|
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.0.tgz",
|
||||||
"integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
|
"integrity": "sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"glob": "^7.1.3"
|
"glob": "^7.1.3"
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"name": "frankerfacez",
|
"name": "frankerfacez",
|
||||||
"author": "Dan Salvato LLC",
|
"author": "Dan Salvato LLC",
|
||||||
"version": "4.16.0",
|
"version": "4.17.0",
|
||||||
"description": "FrankerFaceZ is a Twitch enhancement suite.",
|
"description": "FrankerFaceZ is a Twitch enhancement suite.",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
@ -45,7 +45,7 @@
|
||||||
"json-loader": "^0.5.7",
|
"json-loader": "^0.5.7",
|
||||||
"node-sass": "^4.12.0",
|
"node-sass": "^4.12.0",
|
||||||
"raw-loader": "^3.1.0",
|
"raw-loader": "^3.1.0",
|
||||||
"rimraf": "^2.6.3",
|
"rimraf": "^3.0.0",
|
||||||
"sass-loader": "^7.1.0",
|
"sass-loader": "^7.1.0",
|
||||||
"semver": "^6.3.0",
|
"semver": "^6.3.0",
|
||||||
"terser-webpack-plugin": "^1.3.0",
|
"terser-webpack-plugin": "^1.3.0",
|
||||||
|
@ -62,9 +62,9 @@
|
||||||
"url": "https://github.com/FrankerFaceZ/FrankerFaceZ.git"
|
"url": "https://github.com/FrankerFaceZ/FrankerFaceZ.git"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@ffz/icu-msgparser": "^1.0.1",
|
"@ffz/icu-msgparser": "^1.0.2",
|
||||||
"crypto-js": "^3.1.9-1",
|
"crypto-js": "^3.1.9-1",
|
||||||
"dayjs": "^1.8.15",
|
"dayjs": "^1.8.17",
|
||||||
"displacejs": "github:sirstendec/displace",
|
"displacejs": "github:sirstendec/displace",
|
||||||
"emoji-regex": "^8.0.0",
|
"emoji-regex": "^8.0.0",
|
||||||
"file-saver": "^2.0.1",
|
"file-saver": "^2.0.1",
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
import Parser from '@ffz/icu-msgparser';
|
import Parser from '@ffz/icu-msgparser';
|
||||||
|
|
||||||
import {SERVER, DEBUG} from 'utilities/constants';
|
import {DEBUG} from 'utilities/constants';
|
||||||
import {get, pick_random, shallow_copy, deep_copy} from 'utilities/object';
|
import {get, pick_random, shallow_copy, deep_copy} from 'utilities/object';
|
||||||
import Module from 'utilities/module';
|
import Module from 'utilities/module';
|
||||||
|
|
||||||
|
|
|
@ -4,27 +4,48 @@
|
||||||
// Badge Handling
|
// Badge Handling
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
|
|
||||||
import {NEW_API, API_SERVER, IS_WEBKIT, WEBKIT_CSS as WEBKIT} from 'utilities/constants';
|
import {NEW_API, SERVER, API_SERVER, IS_WEBKIT, WEBKIT_CSS as WEBKIT} from 'utilities/constants';
|
||||||
|
|
||||||
import {createElement, ManagedStyle} from 'utilities/dom';
|
import {createElement, ManagedStyle} from 'utilities/dom';
|
||||||
import {has} from 'utilities/object';
|
import {has} from 'utilities/object';
|
||||||
import Module from 'utilities/module';
|
import Module from 'utilities/module';
|
||||||
|
import { ColorAdjuster } from 'src/utilities/color';
|
||||||
|
|
||||||
export const CSS_BADGES = {
|
const CSS_BADGES = {
|
||||||
staff: { 1: { color: '#200f33', svg: true, trans: { color: '#6441a5' } } },
|
1: {
|
||||||
admin: { 1: { color: '#faaf19', svg: true } },
|
staff: { 1: { color: '#200f33', svg: true, trans: { color: '#6441a5' } } },
|
||||||
global_mod: { 1: { color: '#0c6f20', svg: true } },
|
admin: { 1: { color: '#faaf19', svg: true } },
|
||||||
broadcaster: { 1: { color: '#e71818', svg: true } },
|
global_mod: { 1: { color: '#0c6f20', svg: true } },
|
||||||
moderator: { 1: { color: '#34ae0a', svg: true } },
|
broadcaster: { 1: { color: '#e71818', svg: true } },
|
||||||
twitchbot: { 1: { color: '#34ae0a' } },
|
moderator: { 1: { color: '#34ae0a', svg: true } },
|
||||||
partner: { 1: { color: 'transparent', trans: { image: true, color: '#6441a5' } } },
|
twitchbot: { 1: { color: '#34ae0a' } },
|
||||||
'clip-champ': { 1: { color: '#6441a5'} },
|
partner: { 1: { color: 'transparent', trans: { image: true, color: '#6441a5' } } },
|
||||||
|
'clip-champ': { 1: { color: '#6441a5'} },
|
||||||
|
|
||||||
vip: { 1: { color: '#b33ff0', trans: { color: 'transparent', invert: false}} },
|
vip: { 1: { color: '#b33ff0', trans: { color: 'transparent', invert: false}} },
|
||||||
turbo: { 1: { color: '#6441a5', svg: true } },
|
turbo: { 1: { color: '#6441a5', svg: true } },
|
||||||
premium: { 1: { color: '#009cdc' } },
|
premium: { 1: { color: '#009cdc' } },
|
||||||
|
|
||||||
subscriber: { 0: { color: '#6441a5' }, 1: { color: '#6441a5' }},
|
subscriber: { 0: { color: '#6441a5' }, 1: { color: '#6441a5' }},
|
||||||
|
},
|
||||||
|
|
||||||
|
2: {
|
||||||
|
staff: { 1: { color: '#000' } },
|
||||||
|
admin: { 1: { color: '#FFCA5F' } },
|
||||||
|
broadcaster: { 1: { color: '#E91916' } },
|
||||||
|
moderator: { 1: { color: '#00FA05' } },
|
||||||
|
global_mod: { 1: { color: '#006441' } },
|
||||||
|
twitchbot: { 1: { color: '#00FA05' } },
|
||||||
|
partner: { 1: { color: '#9146FF' } },
|
||||||
|
|
||||||
|
subscriber: { 0: { color: '#8205B4'}, 1: { color: '#8205B4' } },
|
||||||
|
|
||||||
|
vip: { 1: { color: '#FA1ED2' } },
|
||||||
|
turbo: { 1: { color: '#59399A' } },
|
||||||
|
premium: { 1: { color: '#00A8E1' } },
|
||||||
|
'anonymous-cheerer': { 1: { color: '#4B367C' } },
|
||||||
|
'clip-champ': { 1: { color: '#9146FF' } }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export const BADGE_POSITIONS = {
|
export const BADGE_POSITIONS = {
|
||||||
|
@ -41,7 +62,7 @@ export const BADGE_POSITIONS = {
|
||||||
|
|
||||||
|
|
||||||
const NO_REPEAT = 'background-repeat:no-repeat;background-position:center;',
|
const NO_REPEAT = 'background-repeat:no-repeat;background-position:center;',
|
||||||
BASE_IMAGE = 'https://cdn.frankerfacez.com/badges/twitch/',
|
BASE_IMAGE = `${SERVER}/static/badges/twitch/`,
|
||||||
CSS_MASK_IMAGE = IS_WEBKIT ? 'webkitMaskImage' : 'maskImage',
|
CSS_MASK_IMAGE = IS_WEBKIT ? 'webkitMaskImage' : 'maskImage',
|
||||||
|
|
||||||
CSS_TEMPLATES = {
|
CSS_TEMPLATES = {
|
||||||
|
@ -70,9 +91,9 @@ export function generateOverrideCSS(data, style) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export function generateBadgeCSS(badge, version, data, style, is_dark, scale = 1) {
|
export function generateBadgeCSS(badge, version, data, style, is_dark, badge_version = 2, color_fixer, scale = 1) {
|
||||||
let color = data.color || 'transparent',
|
let color = data.color || 'transparent',
|
||||||
base_image = data.image || `${BASE_IMAGE}${badge}${data.svg ? '.svg' : `/${version}/`}`,
|
base_image = data.image || `${BASE_IMAGE}${badge_version}/${badge}${data.svg ? '.svg' : `/${version}/`}`,
|
||||||
trans = false,
|
trans = false,
|
||||||
invert = false,
|
invert = false,
|
||||||
svg, image, image_set;
|
svg, image, image_set;
|
||||||
|
@ -123,6 +144,9 @@ export function generateBadgeCSS(badge, version, data, style, is_dark, scale = 1
|
||||||
image_set = svg;
|
image_set = svg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ( color_fixer && color && color !== 'transparent' )
|
||||||
|
color = color_fixer.process(color) || color;
|
||||||
|
|
||||||
// TODO: Fix the click_url name once we actually support badge clicking.
|
// TODO: Fix the click_url name once we actually support badge clicking.
|
||||||
return `${data.__click_url ? 'cursor:pointer;' : ''}${invert ? 'filter:invert(100%);' : ''}${CSS_TEMPLATES[style]({
|
return `${data.__click_url ? 'cursor:pointer;' : ''}${invert ? 'filter:invert(100%);' : ''}${CSS_TEMPLATES[style]({
|
||||||
scale,
|
scale,
|
||||||
|
@ -148,6 +172,29 @@ export default class Badges extends Module {
|
||||||
this.badges = {};
|
this.badges = {};
|
||||||
this.twitch_badges = {};
|
this.twitch_badges = {};
|
||||||
|
|
||||||
|
this.settings.add('chat.badges.version', {
|
||||||
|
default: 2,
|
||||||
|
ui: {
|
||||||
|
path: 'Chat > Badges >> tabs ~> Appearance',
|
||||||
|
title: 'Version',
|
||||||
|
component: 'setting-select-box',
|
||||||
|
data: [
|
||||||
|
{value: 1, title: '1 (Pre December 2019)'},
|
||||||
|
{value: 2, title: '2 (Current)'}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
this.settings.add('chat.badges.fix-colors', {
|
||||||
|
default: true,
|
||||||
|
ui: {
|
||||||
|
path: 'Chat > Badges >> tabs ~> Appearance',
|
||||||
|
title: 'Adjust badge colors for visibility.',
|
||||||
|
description: 'Ensures that badges are visible against the current background.\n\n**Note:** Only affects badges with custom rendering. Subscriber badges, bit badges, etc. are not affected.',
|
||||||
|
component: 'setting-check-box'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
this.settings.add('chat.badges.hidden', {
|
this.settings.add('chat.badges.hidden', {
|
||||||
default: {},
|
default: {},
|
||||||
type: 'object_merge',
|
type: 'object_merge',
|
||||||
|
@ -169,13 +216,13 @@ export default class Badges extends Module {
|
||||||
})
|
})
|
||||||
|
|
||||||
this.settings.add('chat.badges.style', {
|
this.settings.add('chat.badges.style', {
|
||||||
default: 0,
|
default: 1,
|
||||||
ui: {
|
ui: {
|
||||||
path: 'Chat > Badges >> tabs ~> Appearance',
|
path: 'Chat > Badges >> tabs ~> Appearance',
|
||||||
title: 'Style',
|
title: 'Style',
|
||||||
component: 'setting-select-box',
|
component: 'setting-select-box',
|
||||||
data: [
|
data: [
|
||||||
{value: 0, title: 'Default'},
|
{value: 0, title: 'Square'},
|
||||||
{value: 1, title: 'Rounded'},
|
{value: 1, title: 'Rounded'},
|
||||||
{value: 2, title: 'Circular'},
|
{value: 2, title: 'Circular'},
|
||||||
{value: 3, title: 'Circular (Color Only)'},
|
{value: 3, title: 'Circular (Color Only)'},
|
||||||
|
@ -256,6 +303,8 @@ export default class Badges extends Module {
|
||||||
this.parent.context.on('changed:chat.badges.style', this.rebuildAllCSS, this);
|
this.parent.context.on('changed:chat.badges.style', this.rebuildAllCSS, this);
|
||||||
this.parent.context.on('changed:theme.is-dark', this.rebuildAllCSS, this);
|
this.parent.context.on('changed:theme.is-dark', this.rebuildAllCSS, this);
|
||||||
this.parent.context.on('changed:theme.tooltips-dark', this.rebuildAllCSS, this);
|
this.parent.context.on('changed:theme.tooltips-dark', this.rebuildAllCSS, this);
|
||||||
|
this.parent.context.on('changed:chat.badges.version', this.rebuildAllCSS, this);
|
||||||
|
this.parent.context.on('changed:chat.badges.fix-colors', this.rebuildColoredBadges, this);
|
||||||
|
|
||||||
this.rebuildAllCSS();
|
this.rebuildAllCSS();
|
||||||
this.loadGlobalBadges();
|
this.loadGlobalBadges();
|
||||||
|
@ -509,7 +558,29 @@ export default class Badges extends Module {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
rebuildColor() {
|
||||||
|
if ( this.parent.context.get('chat.badges.fix-colors') ) {
|
||||||
|
this.color_fixer = new ColorAdjuster(
|
||||||
|
this.parent.context.get('theme.is-dark') ? '#181818' : '#FFFFFF',
|
||||||
|
1,
|
||||||
|
2.5
|
||||||
|
);
|
||||||
|
} else
|
||||||
|
this.color_fixer = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
rebuildColoredBadges() {
|
||||||
|
this.rebuildColor();
|
||||||
|
|
||||||
|
this.buildBadgeCSS();
|
||||||
|
this.buildTwitchCSSBadgeCSS();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
rebuildAllCSS() {
|
rebuildAllCSS() {
|
||||||
|
this.rebuildColor();
|
||||||
|
|
||||||
for(const room of this.parent.iterateRooms()) {
|
for(const room of this.parent.iterateRooms()) {
|
||||||
room.buildBadgeCSS();
|
room.buildBadgeCSS();
|
||||||
room.buildModBadgeCSS();
|
room.buildModBadgeCSS();
|
||||||
|
@ -621,7 +692,7 @@ export default class Badges extends Module {
|
||||||
const data = this.badges[key],
|
const data = this.badges[key],
|
||||||
selector = `.ffz-badge[data-badge="${key}"]`;
|
selector = `.ffz-badge[data-badge="${key}"]`;
|
||||||
|
|
||||||
out.push(`${selector}{${generateBadgeCSS(key, 0, data, style, is_dark)}}`);
|
out.push(`${selector}{${generateBadgeCSS(key, 0, data, style, is_dark, 0, this.color_fixer)}}`);
|
||||||
out.push(`.ffz-badge[data-replaced="${key}"]{${generateOverrideCSS(data, style, is_dark)}}`);
|
out.push(`.ffz-badge[data-replaced="${key}"]{${generateOverrideCSS(data, style, is_dark)}}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -686,18 +757,21 @@ export default class Badges extends Module {
|
||||||
|
|
||||||
buildTwitchCSSBadgeCSS() {
|
buildTwitchCSSBadgeCSS() {
|
||||||
const style = this.parent.context.get('chat.badges.style'),
|
const style = this.parent.context.get('chat.badges.style'),
|
||||||
is_dark = this.parent.context.get('theme.is-dark');
|
is_dark = this.parent.context.get('theme.is-dark'),
|
||||||
|
|
||||||
|
badge_version = this.parent.context.get('chat.badges.version'),
|
||||||
|
versioned = CSS_BADGES[badge_version] || {};
|
||||||
|
|
||||||
const out = [];
|
const out = [];
|
||||||
for(const key in CSS_BADGES)
|
for(const key in versioned)
|
||||||
if ( has(CSS_BADGES, key) ) {
|
if ( has(versioned, key) ) {
|
||||||
const data = CSS_BADGES[key];
|
const data = versioned[key];
|
||||||
for(const version in data)
|
for(const version in data)
|
||||||
if ( has(data, version) ) {
|
if ( has(data, version) ) {
|
||||||
const d = data[version],
|
const d = data[version],
|
||||||
selector = `.ffz-badge[data-badge="${key}"][data-version="${version}"]`;
|
selector = `.ffz-badge[data-badge="${key}"][data-version="${version}"]`;
|
||||||
|
|
||||||
out.push(`${selector}{${generateBadgeCSS(key, version, d, style, is_dark)}}`);
|
out.push(`${selector}{${generateBadgeCSS(key, version, d, style, is_dark, badge_version, this.color_fixer)}}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -709,10 +783,13 @@ export default class Badges extends Module {
|
||||||
if ( ! this.twitch_badges )
|
if ( ! this.twitch_badges )
|
||||||
this.style.delete('twitch-badges');
|
this.style.delete('twitch-badges');
|
||||||
|
|
||||||
|
const badge_version = this.parent.context.get('chat.badges.version'),
|
||||||
|
versioned = CSS_BADGES[badge_version] || {};
|
||||||
|
|
||||||
const out = [];
|
const out = [];
|
||||||
for(const key in this.twitch_badges)
|
for(const key in this.twitch_badges)
|
||||||
if ( has(this.twitch_badges, key) ) {
|
if ( has(this.twitch_badges, key) ) {
|
||||||
if ( has(CSS_BADGES, key) )
|
if ( has(versioned, key) )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
const versions = this.twitch_badges[key];
|
const versions = this.twitch_badges[key];
|
||||||
|
|
|
@ -20,7 +20,6 @@ import SettingsMenu from './settings_menu';
|
||||||
import EmoteMenu from './emote_menu';
|
import EmoteMenu from './emote_menu';
|
||||||
import Input from './input';
|
import Input from './input';
|
||||||
import ViewerCards from './viewer_card';
|
import ViewerCards from './viewer_card';
|
||||||
import { isHighlightedReward } from './points';
|
|
||||||
|
|
||||||
|
|
||||||
const REGEX_EMOTES = {
|
const REGEX_EMOTES = {
|
||||||
|
|
|
@ -527,7 +527,7 @@ other {# messages were deleted by a moderator.}
|
||||||
}, the_list);
|
}, the_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
cls = `user-notice-line tw-pd-y-05 ffz--subscribe-line${show_class ? ' ffz--deleted-message' : ''}`;
|
cls = `ffz-notice-line user-notice-line tw-pd-y-05 ffz--subscribe-line${show_class ? ' ffz--deleted-message' : ''}`;
|
||||||
out = [
|
out = [
|
||||||
e('div', {
|
e('div', {
|
||||||
className: 'tw-flex tw-c-text-alt-2',
|
className: 'tw-flex tw-c-text-alt-2',
|
||||||
|
@ -590,7 +590,7 @@ other {# messages were deleted by a moderator.}
|
||||||
count: msg.sub_total
|
count: msg.sub_total
|
||||||
}));
|
}));
|
||||||
|
|
||||||
cls = `user-notice-line tw-pd-y-05 tw-pd-r-2 ffz--subscribe-line${show_class ? ' ffz--deleted-message' : ''}`;
|
cls = `ffz-notice-line user-notice-line tw-pd-y-05 tw-pd-r-2 ffz--subscribe-line${show_class ? ' ffz--deleted-message' : ''}`;
|
||||||
out = [
|
out = [
|
||||||
e('div', {className: 'tw-flex tw-c-text-alt-2'}, [
|
e('div', {className: 'tw-flex tw-c-text-alt-2'}, [
|
||||||
t.chat.context.get('chat.subs.compact') ? null :
|
t.chat.context.get('chat.subs.compact') ? null :
|
||||||
|
@ -652,7 +652,7 @@ other {# messages were deleted by a moderator.}
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
cls = `user-notice-line tw-pd-y-05 tw-pd-r-2 ffz--subscribe-line${show_class ? ' ffz--deleted-message' : ''}`;
|
cls = `ffz-notice-line user-notice-line tw-pd-y-05 tw-pd-r-2 ffz--subscribe-line${show_class ? ' ffz--deleted-message' : ''}`;
|
||||||
out = [
|
out = [
|
||||||
e('div', {className: 'tw-flex tw-c-text-alt-2'}, [
|
e('div', {className: 'tw-flex tw-c-text-alt-2'}, [
|
||||||
t.chat.context.get('chat.subs.compact') ? null :
|
t.chat.context.get('chat.subs.compact') ? null :
|
||||||
|
@ -690,7 +690,7 @@ other {# messages were deleted by a moderator.}
|
||||||
]);
|
]);
|
||||||
|
|
||||||
if ( system_msg ) {
|
if ( system_msg ) {
|
||||||
cls = `user-notice-line tw-pd-y-05 tw-pd-r-2 ffz--ritual-line${show_class ? ' ffz--deleted-message' : ''}`;
|
cls = `ffz-notice-line user-notice-line tw-pd-y-05 tw-pd-r-2 ffz--ritual-line${show_class ? ' ffz--deleted-message' : ''}`;
|
||||||
out = [
|
out = [
|
||||||
system_msg,
|
system_msg,
|
||||||
out && e('div', {
|
out && e('div', {
|
||||||
|
@ -710,7 +710,7 @@ other {# messages were deleted by a moderator.}
|
||||||
t.i18n.formatNumber(getRewardCost(msg.ffz_reward))
|
t.i18n.formatNumber(getRewardCost(msg.ffz_reward))
|
||||||
]);
|
]);
|
||||||
|
|
||||||
cls = `ffz--points-line tw-pd-l-1 tw-pd-y-05 tw-pd-r-2${isHighlightedReward(msg.ffz_reward) ? ' ffz--points-highlight' : ''}${show_class ? ' ffz--deleted-message' : ''}`;
|
cls = `ffz-notice-line ffz--points-line tw-pd-l-1 tw-pd-y-05 tw-pd-r-2${isHighlightedReward(msg.ffz_reward) ? ' ffz--points-highlight' : ''}${show_class ? ' ffz--deleted-message' : ''}`;
|
||||||
out = [
|
out = [
|
||||||
e('div', {className: 'tw-c-text-alt-2'}, [
|
e('div', {className: 'tw-c-text-alt-2'}, [
|
||||||
out ? null : t.actions.renderInline(msg, this.props.showModerationIcons, u, r, e),
|
out ? null : t.actions.renderInline(msg, this.props.showModerationIcons, u, r, e),
|
||||||
|
|
|
@ -23,8 +23,8 @@ const CLASSES = {
|
||||||
|
|
||||||
'prime-offers': '.top-nav__prime',
|
'prime-offers': '.top-nav__prime',
|
||||||
|
|
||||||
'player-ext': '.highwind-video-player .extension-taskbar,.highwind-video-player .extension-container,.highwind-video-player .extensions-dock__layout,.highwind-video-player .extensions-notifications,.highwind-video-player .extensions-video-overlay-size-container',
|
'player-ext': '.video-player .extension-taskbar,.video-player .extension-container,.video-player .extensions-dock__layout,.video-player .extensions-notifications,.video-player .extensions-video-overlay-size-container,.video-player .extensions-dock__layout',
|
||||||
'player-ext-hover': '.highwind-video-player__overlay[data-controls="false"] .extension-taskbar,.highwind-video-player__overlay[data-controls="false"] .extension-container,.highwind-video-player__overlay[data-controls="false"] .extensions-dock__layout,.highwind-video-player__overlay[data-controls="false"] .extensions-notifications,.highwind-video-player__overlay[data-controls="false"] .extensions-video-overlay-size-container',
|
'player-ext-hover': '.video-player__overlay[data-controls="false"] .extension-taskbar,.video-player__overlay[data-controls="false"] .extension-container,.video-player__overlay[data-controls="false"] .extensions-dock__layout,.video-player__overlay[data-controls="false"] .extensions-notifications,.video-player__overlay[data-controls="false"] .extensions-video-overlay-size-container',
|
||||||
|
|
||||||
'player-event-bar': '.channel-root .live-event-banner-ui__header',
|
'player-event-bar': '.channel-root .live-event-banner-ui__header',
|
||||||
'player-rerun-bar': '.channel-root__player-container div.tw-c-text-overlay:not([data-a-target="hosting-ui-header"])',
|
'player-rerun-bar': '.channel-root__player-container div.tw-c-text-overlay:not([data-a-target="hosting-ui-header"])',
|
||||||
|
@ -65,7 +65,7 @@ export default class CSSTweaks extends Module {
|
||||||
|
|
||||||
component: 'setting-check-box'
|
component: 'setting-check-box'
|
||||||
},
|
},
|
||||||
changed: val => this.toggleHide('side-nav', !val)
|
changed: val => this.toggle('hide-side-nav', !val)
|
||||||
});
|
});
|
||||||
|
|
||||||
this.settings.add('layout.side-nav.show-avatars', {
|
this.settings.add('layout.side-nav.show-avatars', {
|
||||||
|
@ -298,7 +298,7 @@ export default class CSSTweaks extends Module {
|
||||||
this.toggle('theatre-nav', this.settings.get('layout.theatre-navigation'));
|
this.toggle('theatre-nav', this.settings.get('layout.theatre-navigation'));
|
||||||
|
|
||||||
this.toggle('hide-side-nav-avatars', ! this.settings.get('layout.side-nav.show-avatars'));
|
this.toggle('hide-side-nav-avatars', ! this.settings.get('layout.side-nav.show-avatars'));
|
||||||
this.toggleHide('side-nav', !this.settings.get('layout.side-nav.show'));
|
this.toggle('hide-side-nav', !this.settings.get('layout.side-nav.show'));
|
||||||
this.toggleHide('side-rec-friends', !this.settings.get('layout.side-nav.show-rec-friends'));
|
this.toggleHide('side-rec-friends', !this.settings.get('layout.side-nav.show-rec-friends'));
|
||||||
this.toggleHide('side-offline-channels', this.settings.get('layout.side-nav.hide-offline'));
|
this.toggleHide('side-offline-channels', this.settings.get('layout.side-nav.hide-offline'));
|
||||||
this.toggleHide('prime-offers', !this.settings.get('layout.prime-offers'));
|
this.toggleHide('prime-offers', !this.settings.get('layout.prime-offers'));
|
||||||
|
|
|
@ -1,7 +1,5 @@
|
||||||
.player .extension-overlay__iframe,
|
.video-player .extension-overlay__iframe,
|
||||||
.player .extension-overlay,
|
.video-player .extension-overlay,
|
||||||
.highwind-video-player .extension-overlay__iframe,
|
.video-player .extension-view__iframe {
|
||||||
.highwind-video-player .extension-overlay,
|
|
||||||
.highwind-video-player .extension-view__iframe {
|
|
||||||
pointer-events: none !important;
|
pointer-events: none !important;
|
||||||
}
|
}
|
|
@ -1,4 +1,3 @@
|
||||||
.highwind-video-player__overlay[data-controls="false"][data-paused="false"][data-ended="false"],
|
.video-player__overlay[data-controls="false"][data-paused="false"][data-ended="false"] {
|
||||||
.player:hover:not([data-controls="true"]):not([data-paused="true"]):not([data-ended="true"]) {
|
|
||||||
cursor: none;
|
cursor: none;
|
||||||
}
|
}
|
|
@ -1,4 +1,3 @@
|
||||||
.highwind-video-player .volume-slider__slider-container,
|
.video-player .volume-slider__slider-container {
|
||||||
.player .player-volume__slider-container {
|
|
||||||
opacity: 1 !important;
|
opacity: 1 !important;
|
||||||
}
|
}
|
|
@ -1,5 +1,5 @@
|
||||||
.highwind-video-player__container--theatre-whispers,
|
.video-player__container--theatre-whispers,
|
||||||
.video-player--theatre.video-player--logged-in .player.video-player__container {
|
.video-player--theatre.video-player--logged-in .video-player.video-player__container {
|
||||||
bottom: 0 !important;
|
bottom: 0 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -164,9 +164,11 @@
|
||||||
background-color: var(--ffz-channel-color-20);
|
background-color: var(--ffz-channel-color-20);
|
||||||
}
|
}
|
||||||
|
|
||||||
.ffz--points-line {
|
.ffz-notice-line {
|
||||||
border-left: 4px solid var(--ffz-channel-color);
|
border-left: 4px solid var(--ffz-channel-color) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ffz--points-line {
|
||||||
.ffz--points-reward,
|
.ffz--points-reward,
|
||||||
.ffz--points-cost {
|
.ffz--points-cost {
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
|
|
10
src/utilities/data/last-broadcast.gql
Normal file
10
src/utilities/data/last-broadcast.gql
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
query FFZ_LastBroadcast($id: ID, $login: String) {
|
||||||
|
user(id: $id, login: $login) {
|
||||||
|
id
|
||||||
|
lastBroadcast {
|
||||||
|
id
|
||||||
|
startedAt
|
||||||
|
title
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -177,6 +177,14 @@ export default class TwitchData extends Module {
|
||||||
return get('data.user', data);
|
return get('data.user', data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async getLastBroadcast(id, login) {
|
||||||
|
const data = await this.queryApollo(
|
||||||
|
require('./data/last-broadcast.gql'),
|
||||||
|
{ id, login }
|
||||||
|
);
|
||||||
|
|
||||||
|
return get('data.user.lastBroadcast', data);
|
||||||
|
}
|
||||||
|
|
||||||
// ========================================================================
|
// ========================================================================
|
||||||
// Broadcast ID
|
// Broadcast ID
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue