diff --git a/package.json b/package.json index 58320942..84dfa87e 100755 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "frankerfacez", "author": "Dan Salvato LLC", - "version": "4.20.89", + "version": "4.20.90", "description": "FrankerFaceZ is a Twitch enhancement suite.", "private": true, "license": "Apache-2.0", diff --git a/src/bridge.js b/src/bridge.js index 3e6e036d..9c119540 100644 --- a/src/bridge.js +++ b/src/bridge.js @@ -34,7 +34,7 @@ class FFZBridge extends Module { this.core_log = this.log.get('core'); - this.log.info(`FrankerFaceZ Settings Bridge v${VER} (build ${VER.build}${VER.commit ? ` - commit ${VER.commit}` : ''})`); + this.log.info(`FrankerFaceZ Settings Bridge v${VER} (build ${VER.build}${VER.commit ? ` - commit ${VER.commit}` : ''}) (initial ${location})`); // ======================================================================== diff --git a/src/clips.js b/src/clips.js index 9df1f3ab..e4b4d77c 100644 --- a/src/clips.js +++ b/src/clips.js @@ -43,7 +43,7 @@ class FrankerFaceZ extends Module { this.core_log = this.log.get('core'); - this.log.info(`FrankerFaceZ Standalone Clips v${VER} (build ${VER.build}${VER.commit ? ` - commit ${VER.commit}` : ''})`); + this.log.info(`FrankerFaceZ Standalone Clips v${VER} (build ${VER.build}${VER.commit ? ` - commit ${VER.commit}` : ''}) (initial ${location})`); // ======================================================================== diff --git a/src/main.js b/src/main.js index 69619324..9063b369 100644 --- a/src/main.js +++ b/src/main.js @@ -47,7 +47,7 @@ class FrankerFaceZ extends Module { this.core_log = this.log.get('core'); - this.log.info(`FrankerFaceZ v${VER} (build ${VER.build}${VER.commit ? ` - commit ${VER.commit}` : ''})`); + this.log.info(`FrankerFaceZ v${VER} (build ${VER.build}${VER.commit ? ` - commit ${VER.commit}` : ''}) (initial ${location})`); // ======================================================================== diff --git a/src/modules/chat/badges.jsx b/src/modules/chat/badges.jsx index 56eb4f59..e11e93b4 100644 --- a/src/modules/chat/badges.jsx +++ b/src/modules/chat/badges.jsx @@ -257,7 +257,16 @@ export default class Badges extends Module { title: 'Use custom moderator badges where available.', component: 'setting-check-box' } - }) + }); + + this.settings.add('chat.badges.custom-vip', { + default: true, + ui: { + path: 'Chat > Badges >> tabs ~> Appearance', + title: 'Use custom VIP badges where available.', + component: 'setting-check-box' + } + }); this.settings.add('chat.badges.style', { default: 1, @@ -558,6 +567,7 @@ export default class Badges extends Module { const hidden_badges = skip_hide ? {} : (this.parent.context.get('chat.badges.hidden') || {}), badge_style = this.parent.context.get('chat.badges.style'), custom_mod = this.parent.context.get('chat.badges.custom-mod'), + custom_vip = this.parent.context.get('chat.badges.custom-vip'), is_mask = badge_style > 5, is_colored = badge_style !== 5, has_image = badge_style !== 3 && badge_style !== 4, @@ -599,19 +609,30 @@ export default class Badges extends Module { slot = last_slot++; const data = dynamic_data[badge_id] || (badge_id === 'founder' && dynamic_data['subscriber']), - urls = badge_id === 'moderator' && custom_mod && room && room.data && room.data.mod_urls, + mod_urls = badge_id === 'moderator' && custom_mod && room && room.data && room.data.mod_urls, + vip_urls = badge_id === 'vip' && custom_vip && room && room.data && room.data.vip_badge, badges = []; - if ( urls ) { + if ( mod_urls ) { const bd = this.getTwitchBadge(badge_id, version, room_id, room_login); badges.push({ provider: 'ffz', - image: urls[4] || urls[2] || urls[1], + image: mod_urls[4] || mod_urls[2] || mod_urls[1], color: '#34ae0a', title: bd ? bd.title : 'Moderator', data }); + } else if ( vip_urls ) { + const bd = this.getTwitchBadge(badge_id, version, room_id, room_login); + badges.push({ + provider: 'ffz', + image: vip_urls[4] || vip_urls[2] || vip_urls[1], + color: 'transparent', + title: bd ? bd.title : 'VIP', + data + }); + } else badges.push({ provider: 'twitch', diff --git a/src/modules/chat/index.js b/src/modules/chat/index.js index 4b88f9bb..6294cc95 100644 --- a/src/modules/chat/index.js +++ b/src/modules/chat/index.js @@ -8,7 +8,7 @@ import dayjs from 'dayjs'; import Module from 'utilities/module'; import {createElement, ManagedStyle} from 'utilities/dom'; -import {timeout, has, glob_to_regex, escape_regex, split_chars} from 'utilities/object'; +import {timeout, has, glob_to_regex, escape_regex, split_chars, deep_copy} from 'utilities/object'; import Badges from './badges'; import Emotes from './emotes'; @@ -88,11 +88,28 @@ export default class Chat extends Module { this.rich_providers = {}; this.__rich_providers = []; + this._hl_reasons = {}; + this.addHighlightReason('mention', 'Mentioned'); + this.addHighlightReason('user', 'Highlight User'); + this.addHighlightReason('badge', 'Highlight Badge'); + this.addHighlightReason('term', 'Highlight Term'); // ======================================================================== // Settings // ======================================================================== + /*this.settings.add('debug.highlight-reason', { + default: [], + type: 'basic_array_merge', + ui: { + path: 'Chat > Debugging >> General', + title: 'Test', + component: 'setting-select-box', + multiple: true, + data: () => this.getHighlightReasons() + } + });*/ + this.settings.add('debug.link-resolver.source', { default: null, ui: { @@ -1598,6 +1615,28 @@ export default class Chat extends Module { } + addHighlightReason(key, data) { + if ( typeof key === 'object' && key.key ) { + data = key; + key = data.key; + + } else if ( typeof data === 'string' ) + data = {title: data}; + + data.value = data.key = key; + if ( ! data.i18n_key ) + data.i18n_key = `hl-reason.${key}`; + + if ( this._hl_reasons[key] ) + throw new Error(`Highlight Reason already exists with key ${key}`); + + this._hl_reasons[key] = data; + } + + getHighlightReasons() { + return Object.values(this._hl_reasons); + } + addTokenizer(tokenizer) { const type = tokenizer.type; this.tokenizers[type] = tokenizer; diff --git a/src/modules/chat/room.js b/src/modules/chat/room.js index 86886574..9340c509 100644 --- a/src/modules/chat/room.js +++ b/src/modules/chat/room.js @@ -111,6 +111,7 @@ export default class Room { this.style.delete('css'); this.buildModBadgeCSS(); + this.buildVIPBadgeCSS(); } if ( other.badges && ! this.badges ) { @@ -331,6 +332,7 @@ export default class Room { this.style.delete('css'); this.buildModBadgeCSS(); + this.buildVIPBadgeCSS(); return true; } @@ -429,6 +431,28 @@ export default class Room { this.buildBadgeCSS(); } + buildVIPBadgeCSS() { + if ( this.destroyed ) + return; + + if ( ! this.data || ! this.data.vip_badge || ! this.manager.context.get('chat.badges.custom-vip') ) + return this.style.delete('vip-badge'); + + const urls = this.data.vip_badge, + image = `url("${urls[1]}")`; + + let image_set; + if ( urls[2] || urls[4] ) + image_set = `${WEBKIT}image-set(${image} 1x${urls[2] ? `, url("${urls[2]}") 2x` : ''}${urls[4] ? `, url("${urls[4]}") 4x` : ''})`; + + this.style.set('vip-badge', `[data-room-id="${this.id}"] .ffz-badge[data-badge="vip"] { + background-color: transparent; + background-image: ${image}; + ${image_set ? `background-image: ${image_set};` : ''} + ${WEBKIT}mask-image: unset; + }`); + } + buildModBadgeCSS() { if ( this.destroyed ) return; diff --git a/src/modules/chat/tokenizers.jsx b/src/modules/chat/tokenizers.jsx index 3d78814c..e36b1ade 100644 --- a/src/modules/chat/tokenizers.jsx +++ b/src/modules/chat/tokenizers.jsx @@ -1693,11 +1693,13 @@ export const TwitchEmotes = { let src, srcSet; let src2, srcSet2; + let can_big = true; const replacement = REPLACEMENTS[e_id]; if ( replacement && use_replacements ) { src = `${REPLACEMENT_BASE}${replacement}`; srcSet = ''; + can_big = false; } else { src = `${TWITCH_EMOTE_BASE}${e_id}/1.0`; @@ -1718,7 +1720,8 @@ export const TwitchEmotes = { src2, srcSet2, big, - can_big: true, + can_big, + height: 28, // Not always accurate but close enough. text: text.slice(e_start - t_start, e_end - t_start).join(''), modifiers: [] }); diff --git a/src/modules/main_menu/components/setting-select-box.vue b/src/modules/main_menu/components/setting-select-box.vue index 3e9a79d6..143bf8ef 100644 --- a/src/modules/main_menu/components/setting-select-box.vue +++ b/src/modules/main_menu/components/setting-select-box.vue @@ -3,8 +3,8 @@ :class="{inherits: isInherited, default: isDefault}" class="ffz--widget ffz--select-box" > -