mirror of
https://github.com/FrankerFaceZ/FrankerFaceZ.git
synced 2025-08-04 11:44:00 +00:00
4.66.0
* Added: Option to hide emote tool-tips from the FFZ Emote Menu, which can improve performance. * Changed: Re-add support for older browsers that do not support `crypto.randomUUID()`. I do not consider this a bug, since users should realistically not be on browsers that old for their own safety, but it is a small enough change that I'll allow it. * Fixed: The option to report emotes not appearing on emote cards for Twitch emotes. (Closes #1450) * Fixed: Make rich embeds in Chat on Videos slightly narrower so they don't get cut off. * API Added: Chat message objects now have `ffz_first_msg` and `ffz_returning` flags for use by add-ons. * API Fixed: Cut down on unnecessary warning logging from `createElement`
This commit is contained in:
parent
786275e7d7
commit
44e30e985d
7 changed files with 53 additions and 10 deletions
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"name": "frankerfacez",
|
"name": "frankerfacez",
|
||||||
"author": "Dan Salvato LLC",
|
"author": "Dan Salvato LLC",
|
||||||
"version": "4.65.1",
|
"version": "4.66.0",
|
||||||
"description": "FrankerFaceZ is a Twitch enhancement suite.",
|
"description": "FrankerFaceZ is a Twitch enhancement suite.",
|
||||||
"private": true,
|
"private": true,
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
|
|
|
@ -294,7 +294,7 @@ Twilight.KNOWN_MODULES['algolia-search'].use_result = true;
|
||||||
Twilight.KNOWN_MODULES['algolia-search'].chunks = 'core';
|
Twilight.KNOWN_MODULES['algolia-search'].chunks = 'core';
|
||||||
|
|
||||||
Twilight.KNOWN_MODULES['user-report'].use_result = true;
|
Twilight.KNOWN_MODULES['user-report'].use_result = true;
|
||||||
Twilight.KNOWN_MODULES['user-report'].chunks = 'core';
|
Twilight.KNOWN_MODULES['user-report'].chunks = n => ! n || n.includes('core') || n.includes('common');
|
||||||
|
|
||||||
Twilight.KNOWN_MODULES['sub-form'].use_result = true;
|
Twilight.KNOWN_MODULES['sub-form'].use_result = true;
|
||||||
Twilight.KNOWN_MODULES['sub-form'].chunks = 'core';
|
Twilight.KNOWN_MODULES['sub-form'].chunks = 'core';
|
||||||
|
|
|
@ -322,6 +322,16 @@ export default class EmoteMenu extends Module {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.settings.add('chat.emote-menu.tooltips', {
|
||||||
|
default: true,
|
||||||
|
ui: {
|
||||||
|
path: 'Chat > Emote Menu >> Appearance',
|
||||||
|
title: 'Display emote preview tool-tips in the FFZ Emote Menu.',
|
||||||
|
component: 'setting-check-box',
|
||||||
|
description: 'You may wish to disable this for performance reasons.'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
this.settings.add('chat.emote-menu.show-emoji', {
|
this.settings.add('chat.emote-menu.show-emoji', {
|
||||||
default: true,
|
default: true,
|
||||||
ui: {
|
ui: {
|
||||||
|
@ -418,6 +428,7 @@ export default class EmoteMenu extends Module {
|
||||||
this.chat.context.on('changed:chat.emotes.enabled', rebuild);
|
this.chat.context.on('changed:chat.emotes.enabled', rebuild);
|
||||||
this.chat.context.on('changed:chat.emote-menu.modifiers', rebuild);
|
this.chat.context.on('changed:chat.emote-menu.modifiers', rebuild);
|
||||||
this.chat.context.on('changed:chat.emote-menu.show-emoji', rebuild);
|
this.chat.context.on('changed:chat.emote-menu.show-emoji', rebuild);
|
||||||
|
this.chat.context.on('changed:chat.emote-menu.tooltips', rebuild);
|
||||||
this.chat.context.on('changed:chat.fix-bad-emotes', rebuild);
|
this.chat.context.on('changed:chat.fix-bad-emotes', rebuild);
|
||||||
this.chat.context.on('changed:chat.emote-menu.effect-tab', rebuild);
|
this.chat.context.on('changed:chat.emote-menu.effect-tab', rebuild);
|
||||||
this.chat.context.on('changed:chat.emote-menu.sort-emotes', rebuild);
|
this.chat.context.on('changed:chat.emote-menu.sort-emotes', rebuild);
|
||||||
|
@ -909,7 +920,9 @@ export default class EmoteMenu extends Module {
|
||||||
has_modifiers = Array.isArray(modifiers) && modifiers.length > 0,
|
has_modifiers = Array.isArray(modifiers) && modifiers.length > 0,
|
||||||
//has_menu = has_modifiers && this.state.open_menu == emote.id,
|
//has_menu = has_modifiers && this.state.open_menu == emote.id,
|
||||||
animated = this.props.animated,
|
animated = this.props.animated,
|
||||||
hidden = visibility && emote.hidden;
|
hidden = visibility && emote.hidden,
|
||||||
|
|
||||||
|
tt = t.chat.context.get('chat.emote-menu.tooltips');
|
||||||
|
|
||||||
let src, srcSet;
|
let src, srcSet;
|
||||||
if ( animated && emote.animSrc ) {
|
if ( animated && emote.animSrc ) {
|
||||||
|
@ -922,7 +935,7 @@ export default class EmoteMenu extends Module {
|
||||||
|
|
||||||
return (<button
|
return (<button
|
||||||
key={emote.id}
|
key={emote.id}
|
||||||
class={`ffz-tooltip emote-picker__emote-link${!visibility && locked ? ' locked' : ''}${hidden ? ' emote-hidden' : ''}`}
|
class={`${tt ? 'ffz-tooltip ' : ''}emote-picker__emote-link${!visibility && locked ? ' locked' : ''}${hidden ? ' emote-hidden' : ''}`}
|
||||||
data-tooltip-type="emote"
|
data-tooltip-type="emote"
|
||||||
data-provider={emote.provider}
|
data-provider={emote.provider}
|
||||||
data-id={emote.id}
|
data-id={emote.id}
|
||||||
|
@ -1014,11 +1027,13 @@ export default class EmoteMenu extends Module {
|
||||||
emoji_y = (emote.y * (t.emoji_size + 2)) + 1,
|
emoji_y = (emote.y * (t.emoji_size + 2)) + 1,
|
||||||
|
|
||||||
x_pct = 100 * emoji_x / t.emoji_sheet_remain,
|
x_pct = 100 * emoji_x / t.emoji_sheet_remain,
|
||||||
y_pct = 100 * emoji_y / t.emoji_sheet_remain;
|
y_pct = 100 * emoji_y / t.emoji_sheet_remain,
|
||||||
|
|
||||||
|
tt = t.chat.context.get('chat.emote-menu.tooltips');
|
||||||
|
|
||||||
return (<button
|
return (<button
|
||||||
key={emote.id}
|
key={emote.id}
|
||||||
class={`ffz-tooltip emote-picker__emote-link${locked ? ' locked' : ''}${emote.emoji ? ' emote-picker__emoji' : ''}`}
|
class={`${tt ? 'ffz-tooltip ' : ''}emote-picker__emote-link${locked ? ' locked' : ''}${emote.emoji ? ' emote-picker__emoji' : ''}`}
|
||||||
data-tooltip-type="emote"
|
data-tooltip-type="emote"
|
||||||
data-provider={emote.provider}
|
data-provider={emote.provider}
|
||||||
data-id={emote.id}
|
data-id={emote.id}
|
||||||
|
|
|
@ -2968,6 +2968,9 @@ export default class ChatHook extends Module {
|
||||||
message.roomLogin = chan;
|
message.roomLogin = chan;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
message.ffz_first_msg = message.isFirstMsg || original.message?.isFirstMsg || false;
|
||||||
|
message.ffz_returning = original.message?.isReturningChatter || false;
|
||||||
|
|
||||||
if ( original.message ) {
|
if ( original.message ) {
|
||||||
const user = original.message.user,
|
const user = original.message.user,
|
||||||
flags = original.message.flags;
|
flags = original.message.flags;
|
||||||
|
|
|
@ -136,6 +136,9 @@
|
||||||
|
|
||||||
.ffz--chat-card {
|
.ffz--chat-card {
|
||||||
.vod-message & {
|
.vod-message & {
|
||||||
|
|
||||||
|
width: calc(100% - 1.5rem) !important;
|
||||||
|
|
||||||
.ffz--card-text {
|
.ffz--card-text {
|
||||||
max-width: 18rem;
|
max-width: 18rem;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
|
|
||||||
import {has} from 'utilities/object';
|
import {has} from 'utilities/object';
|
||||||
import type { DomFragment, OptionalArray } from './types';
|
import type { DomFragment, OptionalArray } from './types';
|
||||||
|
import { DEBUG } from './constants';
|
||||||
|
|
||||||
const ATTRS = [
|
const ATTRS = [
|
||||||
'accept', 'accept-charset', 'accesskey', 'action', 'align', 'alt', 'async',
|
'accept', 'accept-charset', 'accesskey', 'action', 'align', 'alt', 'async',
|
||||||
|
@ -184,7 +185,7 @@ export function createElement(tag: string, props?: any, ...children: DomFragment
|
||||||
else
|
else
|
||||||
el.style.setProperty(key, prop[key]);
|
el.style.setProperty(key, prop[key]);
|
||||||
}
|
}
|
||||||
else
|
else if ( DEBUG && prop != null )
|
||||||
console.warn('unsupported style value', prop);
|
console.warn('unsupported style value', prop);
|
||||||
|
|
||||||
} else if ( lk === 'dataset' ) {
|
} else if ( lk === 'dataset' ) {
|
||||||
|
@ -192,7 +193,7 @@ export function createElement(tag: string, props?: any, ...children: DomFragment
|
||||||
for(const k in prop)
|
for(const k in prop)
|
||||||
if ( has(prop, k) )
|
if ( has(prop, k) )
|
||||||
el.dataset[camelCase(k)] = prop[k];
|
el.dataset[camelCase(k)] = prop[k];
|
||||||
} else
|
} else if ( DEBUG && prop != null )
|
||||||
console.warn('unsupported dataset value', prop);
|
console.warn('unsupported dataset value', prop);
|
||||||
|
|
||||||
} else if ( key === 'dangerouslySetInnerHTML' ) {
|
} else if ( key === 'dangerouslySetInnerHTML' ) {
|
||||||
|
|
|
@ -59,9 +59,30 @@ export function isValidShortcut(key: string) {
|
||||||
/**
|
/**
|
||||||
* Generate a random UUIDv4.
|
* Generate a random UUIDv4.
|
||||||
*
|
*
|
||||||
* @deprecated Just use {@link crypto.randomUUID} directly.
|
* This method has a fallback implementation for people using
|
||||||
|
* ancient browsers without {@link crypto.randomUUID}.
|
||||||
*/
|
*/
|
||||||
export const generateUUID = () => crypto.randomUUID();
|
export const generateUUID = crypto.randomUUID
|
||||||
|
? () => crypto.randomUUID()
|
||||||
|
: function generateUUID(input?: any) {
|
||||||
|
return input // if the placeholder was passed, return
|
||||||
|
? ( // a random number from 0 to 15
|
||||||
|
input ^ // unless b is 8,
|
||||||
|
Math.random() // in which case
|
||||||
|
* 16 // a random number from
|
||||||
|
>> input/4 // 8 to 11
|
||||||
|
).toString(16) // in hexadecimal
|
||||||
|
: ( // or otherwise a concatenated string:
|
||||||
|
[1e7] as any + // 10000000 +
|
||||||
|
-1e3 + // -1000 +
|
||||||
|
-4e3 + // -4000 +
|
||||||
|
-8e3 + // -80000000 +
|
||||||
|
-1e11 // -100000000000,
|
||||||
|
).replace( // replacing
|
||||||
|
/[018]/g, // zeroes, ones, and eights with
|
||||||
|
generateUUID // random hex digits
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue