From 9086230686537beb7c15eb7105e9eca5551d259a Mon Sep 17 00:00:00 2001 From: SirStendec Date: Tue, 2 Mar 2021 16:55:25 -0500 Subject: [PATCH] 4.20.72 * Added: Setting to change the height of chat actions. * Added: Profiles can now be toggled via hotkey. * Added: Profiles can now be imported from URL as well as File. * Added: Profiles with update URLs can have automatic updates disabled. * Fixed: Support for the `clips.twitch.tv` domain. * Fixed: Badges that make use of foreground text are no longer white in light themes. * Fixed: Mod Icons appearing smaller than normal. * Changed: Allow several types of actions, unrelated to moderation, to be used on a person's own chat messages. * Changed: Better warn users in the Control Center when the current profile is set to automatically update. * Changed: Make the FFZ Control Center remember which profile is selected when re-opening / refreshing. * API Added: Add-ons can now target specific supported flavors. Choices thus far are `main` and `clips`. * API Added: The `site.menu_button` now has `addToast(...)` and can display multiple toasts. Toasts can also time out. * API Fixed: `openFile(...)` never resolving if the user closes the dialog without selecting a file. --- package-lock.json | 135 ++--- package.json | 4 +- src/addons.js | 22 +- src/entry.js | 10 +- src/main.js | 1 + src/modules/chat/actions/index.jsx | 21 +- src/modules/chat/actions/types.jsx | 7 +- src/modules/chat/badges.jsx | 3 +- src/modules/chat/emotes.js | 3 +- src/modules/chat/index.js | 6 +- src/modules/chat/room.js | 9 +- .../main_menu/components/action-preview.vue | 2 +- .../main_menu/components/main-menu.vue | 5 + .../main_menu/components/menu-page.vue | 15 +- .../main_menu/components/profile-editor.vue | 112 ++++- .../main_menu/components/profile-manager.vue | 156 +++++- .../main_menu/components/profile-selector.vue | 52 +- .../components/setting-color-box.vue | 1 + .../main_menu/components/setting-hotkey.vue | 1 + src/modules/main_menu/index.js | 15 +- src/raven.js | 2 +- src/settings/context.js | 10 + src/settings/index.js | 35 +- src/settings/profile.js | 95 +++- src/settings/providers.js | 7 +- src/sites/clips/chat.jsx | 208 ++++++++ .../css_tweaks/chat-borders-3d-inset.scss | 15 + .../clips/css_tweaks/chat-borders-3d.scss | 15 + .../clips/css_tweaks/chat-borders-wide.scss | 8 + src/sites/clips/css_tweaks/chat-borders.scss | 8 + src/sites/clips/css_tweaks/chat-font.scss | 9 + src/sites/clips/css_tweaks/chat-rows.scss | 13 + .../css_tweaks/emote-alignment-baseline.scss | 8 + .../css_tweaks/emote-alignment-padded.scss | 3 + src/sites/clips/css_tweaks/full-width.scss | 9 + src/sites/clips/css_tweaks/global-font.scss | 6 + .../clips/css_tweaks/player-ext-mouse.scss | 5 + .../clips/css_tweaks/player-hide-mouse.scss | 3 + src/sites/clips/css_tweaks/player-volume.scss | 3 + .../clips/css_tweaks/square-avatars.scss | 19 + src/sites/clips/index.jsx | 218 ++++++++ src/sites/clips/line.jsx | 213 ++++++++ src/sites/clips/player.jsx | 23 + src/sites/clips/styles/clips-main.scss | 43 ++ src/sites/clips/theme.js | 464 ++++++++++++++++++ src/sites/twitch-clips/modules/chat/line.jsx | 2 +- src/sites/twitch-twilight/index.js | 6 + .../twitch-twilight/modules/chat/index.js | 3 + .../twitch-twilight/modules/chat/line.js | 10 +- src/sites/twitch-twilight/modules/layout.js | 10 + .../twitch-twilight/modules/menu_button.jsx | 266 ++++++++-- src/sites/twitch-twilight/styles/chat.scss | 14 +- .../twitch-twilight/styles/menu_button.scss | 16 + src/std-components/key-picker.vue | 4 +- src/utilities/css-tweaks.js | 88 ++++ src/utilities/dom.js | 22 +- styles/main.scss | 3 + styles/widgets.scss | 4 +- styles/widgets/main-menu.scss | 2 +- styles/widgets/profile-selector.scss | 2 +- webpack.common.js | 15 +- 61 files changed, 2267 insertions(+), 222 deletions(-) create mode 100644 src/sites/clips/chat.jsx create mode 100644 src/sites/clips/css_tweaks/chat-borders-3d-inset.scss create mode 100644 src/sites/clips/css_tweaks/chat-borders-3d.scss create mode 100644 src/sites/clips/css_tweaks/chat-borders-wide.scss create mode 100644 src/sites/clips/css_tweaks/chat-borders.scss create mode 100644 src/sites/clips/css_tweaks/chat-font.scss create mode 100644 src/sites/clips/css_tweaks/chat-rows.scss create mode 100644 src/sites/clips/css_tweaks/emote-alignment-baseline.scss create mode 100644 src/sites/clips/css_tweaks/emote-alignment-padded.scss create mode 100644 src/sites/clips/css_tweaks/full-width.scss create mode 100644 src/sites/clips/css_tweaks/global-font.scss create mode 100644 src/sites/clips/css_tweaks/player-ext-mouse.scss create mode 100644 src/sites/clips/css_tweaks/player-hide-mouse.scss create mode 100644 src/sites/clips/css_tweaks/player-volume.scss create mode 100644 src/sites/clips/css_tweaks/square-avatars.scss create mode 100644 src/sites/clips/index.jsx create mode 100644 src/sites/clips/line.jsx create mode 100644 src/sites/clips/player.jsx create mode 100644 src/sites/clips/styles/clips-main.scss create mode 100644 src/sites/clips/theme.js create mode 100644 src/utilities/css-tweaks.js diff --git a/package-lock.json b/package-lock.json index 7c8deaf6..05701bea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "frankerfacez", - "version": "4.20.59", + "version": "4.20.71", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1373,9 +1373,9 @@ "dev": true }, "aws4": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.0.tgz", - "integrity": "sha512-3YDiu347mtVtjpyV3u5kVqQLP242c06zwDOgpeRnybmXlYYsLbtTrUBUm8i8srONt+FWobl5aibnU1030PeeuA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", "dev": true }, "babel-eslint": { @@ -2207,15 +2207,14 @@ } }, "clone-deep": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz", - "integrity": "sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dev": true, "requires": { - "for-own": "^1.0.0", "is-plain-object": "^2.0.4", - "kind-of": "^6.0.0", - "shallow-clone": "^1.0.0" + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" } }, "code-point-at": { @@ -4009,15 +4008,6 @@ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -4413,13 +4403,33 @@ "dev": true }, "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", "dev": true, "requires": { - "ajv": "^6.5.5", + "ajv": "^6.12.3", "har-schema": "^2.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + } } }, "has": { @@ -5171,9 +5181,9 @@ } }, "js-base64": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.2.tgz", - "integrity": "sha512-1hgLrLIrmCgZG+ID3VoLNLOSwjGnoZa8tyrUdEteMeIzsT6PH7PMLyUvbDwzNE56P3PNxyvuIOx4Uh2E5rzQIw==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", "dev": true }, "js-cookie": { @@ -5411,12 +5421,6 @@ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, - "lodash.tail": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz", - "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=", - "dev": true - }, "lodash.throttle": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", @@ -5789,24 +5793,6 @@ } } }, - "mixin-object": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", - "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", - "dev": true, - "requires": { - "for-in": "^0.1.3", - "is-extendable": "^0.1.1" - }, - "dependencies": { - "for-in": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", - "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=", - "dev": true - } - } - }, "mkdirp": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", @@ -7577,29 +7563,22 @@ } }, "sass-loader": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.1.0.tgz", - "integrity": "sha512-+G+BKGglmZM2GUSfT9TLuEp6tzehHPjAMoRRItOojWIqIGPloVCMhNIQuG639eJ+y033PaGTSjLaTHts8Kw79w==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.3.1.tgz", + "integrity": "sha512-tuU7+zm0pTCynKYHpdqaPpe+MMTQ76I9TPZ7i4/5dZsigE350shQWe5EZNl5dBidM49TPET75tNqRbcsUZWeNA==", "dev": true, "requires": { - "clone-deep": "^2.0.1", + "clone-deep": "^4.0.1", "loader-utils": "^1.0.1", - "lodash.tail": "^4.1.1", "neo-async": "^2.5.0", - "pify": "^3.0.0", - "semver": "^5.5.0" + "pify": "^4.0.1", + "semver": "^6.3.0" }, "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - }, "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } @@ -7832,22 +7811,12 @@ } }, "shallow-clone": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz", - "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", "dev": true, "requires": { - "is-extendable": "^0.1.1", - "kind-of": "^5.0.0", - "mixin-object": "^2.0.1" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } + "kind-of": "^6.0.2" } }, "shebang-command": { @@ -8222,9 +8191,9 @@ } }, "spdx-license-ids": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", + "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", "dev": true }, "spdy": { diff --git a/package.json b/package.json index 529ee56c..69481c9b 100755 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "frankerfacez", "author": "Dan Salvato LLC", - "version": "4.20.71", + "version": "4.20.72", "description": "FrankerFaceZ is a Twitch enhancement suite.", "license": "Apache-2.0", "scripts": { @@ -46,9 +46,9 @@ "json-loader": "^0.5.7", "jszip": "^3.6.0", "node-sass": "^4.14.1", + "sass-loader": "^7.1.0", "raw-loader": "^3.1.0", "rimraf": "^3.0.2", - "sass-loader": "^7.1.0", "semver": "^7.3.2", "terser-webpack-plugin": "^3.0.6", "vue": "^2.6.11", diff --git a/src/addons.js b/src/addons.js index d47a120e..8488d3db 100644 --- a/src/addons.js +++ b/src/addons.js @@ -27,6 +27,8 @@ export default class AddonManager extends Module { this.load_requires = ['settings']; + this.target = this.parent.flavor || 'unknown'; + this.has_dev = false; this.reload_required = false; this.addons = {}; @@ -50,6 +52,7 @@ export default class AddonManager extends Module { getAddons: () => Object.values(this.addons), hasAddon: id => this.hasAddon(id), getVersion: id => this.getVersion(id), + doesAddonTarget: id => this.doesAddonTarget(id), isAddonEnabled: id => this.isAddonEnabled(id), isAddonExternal: id => this.isAddonExternal(id), enableAddon: id => this.enableAddon(id), @@ -81,13 +84,27 @@ export default class AddonManager extends Module { // We do not await enabling add-ons because that would delay the // main script's execution. for(const id of this.enabled_addons) - if ( this.hasAddon(id) ) + if ( this.hasAddon(id) && this.doesAddonTarget(id) ) this._enableAddon(id); this.emit(':ready'); }); } + + doesAddonTarget(id) { + const data = this.addons[id]; + if ( ! data ) + return false; + + const targets = data.targets ?? ['main']; + if ( ! Array.isArray(targets) ) + return false; + + return targets.includes(this.target); + } + + generateLog() { const out = ['Known']; for(const [id, addon] of Object.entries(this.addons)) @@ -323,7 +340,8 @@ export default class AddonManager extends Module { this.settings.provider.set('addons.enabled', this.enabled_addons); // Actually load it. - this._enableAddon(id); + if ( this.doesAddonTarget(id) ) + this._enableAddon(id); } async disableAddon(id, save = true) { diff --git a/src/entry.js b/src/entry.js index affcf4e1..a2ffbb43 100644 --- a/src/entry.js +++ b/src/entry.js @@ -6,17 +6,19 @@ return; const DEBUG = localStorage.ffzDebugMode == 'true' && document.body.classList.contains('ffz-dev'), + HOST = location.hostname, FLAVOR = - location.hostname.includes('player') ? 'player' : - (location.pathname === '/p/ffz_bridge/' ? 'bridge' : 'avalon'), + HOST.includes('player') ? 'player' : + HOST.includes('clips') ? 'clips' : + (location.pathname === '/p/ffz_bridge/' ? 'bridge' : 'avalon'), SERVER = DEBUG ? '//localhost:8000' : '//cdn.frankerfacez.com', - CLIPS = /clips\.twitch\.tv/.test(location.hostname) ? 'clips/' : '', + //CLIPS = /clips\.twitch\.tv/.test(location.hostname) ? 'clips/' : '', script = document.createElement('script'); script.id = 'ffz-script'; script.async = true; script.crossOrigin = 'anonymous'; - script.src = `${SERVER}/script/${CLIPS}${FLAVOR}.js?_=${Date.now()}`; + script.src = `${SERVER}/script/${FLAVOR}.js?_=${Date.now()}`; document.head.appendChild(script); })(); \ No newline at end of file diff --git a/src/main.js b/src/main.js index d50cebc5..69619324 100644 --- a/src/main.js +++ b/src/main.js @@ -27,6 +27,7 @@ class FrankerFaceZ extends Module { FrankerFaceZ.instance = this; + this.flavor = 'main'; this.name = 'frankerfacez'; this.__state = 0; this.__modules.core = this; diff --git a/src/modules/chat/actions/index.jsx b/src/modules/chat/actions/index.jsx index dae3a951..ceeb647b 100644 --- a/src/modules/chat/actions/index.jsx +++ b/src/modules/chat/actions/index.jsx @@ -26,6 +26,23 @@ export default class Actions extends Module { this.actions = {}; this.renderers = {}; + this.settings.add('chat.actions.size', { + default: 16, + ui: { + path: 'Chat > Actions @{"always_list_pages": true} >> Appearance', + title: 'Action Size', + description: "How tall actions should be, in pixels. This may be affected by your browser's zoom and font size settings.", + component: 'setting-text-box', + process(val) { + val = parseInt(val, 10); + if ( isNaN(val) || ! isFinite(val) || val <= 0 ) + return 16; + + return val; + } + } + }); + this.settings.add('chat.actions.reasons', { default: [ {v: {text: 'One-Man Spam', i18n: 'chat.reasons.spam'}}, @@ -444,7 +461,7 @@ export default class Actions extends Module { contents = def.render.call(this, ap, createElement, color); actions.push(