1
0
Fork 0
mirror of https://github.com/FrankerFaceZ/FrankerFaceZ.git synced 2025-06-27 21:05:53 +00:00
* Added: Setting to enable or disable message effects. When disabled, they appear as a standard redemption with a notice of how many bits were spent redeeming them.
* Fixed: The setting to only animate emotes on hover not working for "Gigantified" emotes.
* Fixed: Add-on emotes not appearing with animations using the FFZ:GE "Gifantified" points reward.
* Fixed: Message Effects not rendering correctly.
* Fixed: "Gigantified" emotes appearing the incorrect size when using both the Larger Emotes option and the Limit Native Emote Size option.
This commit is contained in:
SirStendec 2024-06-17 14:09:46 -04:00
parent f79f1ba21d
commit e2e315d702
7 changed files with 77 additions and 23 deletions

View file

@ -1,7 +1,7 @@
{ {
"name": "frankerfacez", "name": "frankerfacez",
"author": "Dan Salvato LLC", "author": "Dan Salvato LLC",
"version": "4.72.2", "version": "4.72.3",
"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",

View file

@ -1274,7 +1274,8 @@ export default class Emotes extends Module {
const ds = em.dataset; const ds = em.dataset;
if ( ds.normalSrc && ds.hoverSrc ) { if ( ds.normalSrc && ds.hoverSrc ) {
em.src = ds.hoverSrc; em.src = ds.hoverSrc;
em.srcset = ds.hoverSrcSet; if (em.srcset)
em.srcset = ds.hoverSrcSet;
} }
} }
}); });
@ -1303,7 +1304,8 @@ export default class Emotes extends Module {
const ds = em.dataset; const ds = em.dataset;
if ( ds.normalSrc ) { if ( ds.normalSrc ) {
em.src = ds.normalSrc; em.src = ds.normalSrc;
em.srcset = ds.normalSrcSet; if (em.srcset)
em.srcset = ds.normalSrcSet;
} }
} }
}); });

View file

@ -2567,16 +2567,18 @@ export default class Chat extends Module {
} }
renderGiantEmote(token, e) { renderGiantEmote(token, e) {
if ( ! e ) if ( ! e )
e = createElement; e = createElement;
const animated = token.anim === 1; const animated = token.anim === 1,
hover_animated = token.anim === 2;
let src, hoverSrc, height; let src, hoverSrc, height;
if (token.provider === 'twitch') { if (token.provider === 'twitch') {
src = getTwitchEmoteURL(token.id, 4, animated, true); src = getTwitchEmoteURL(token.id, 4, animated, true);
if (hover_animated)
hoverSrc = getTwitchEmoteURL(token.id, 4, true, true);
height = 112; height = 112;
} else if (token.provider === 'ffz') { } else if (token.provider === 'ffz') {
@ -2584,16 +2586,18 @@ export default class Chat extends Module {
emote = emote_set?.emotes?.[token.id]; emote = emote_set?.emotes?.[token.id];
if ( emote ) { if ( emote ) {
const urls = emote.urls; let urls = (animated ? emote.animated : null) ?? emote.urls;
if ( urls?.[4] ) { let pair = getBiggestImage(urls);
src = urls[4]; if (! pair )
height = emote.height * 4; return null;
} else if ( urls?.[2] ) {
src = urls[2]; src = pair[0];
height = emote.height * 2; height = emote.height * pair[1];
} else if ( urls?.[1] ) {
src = urls[1]; if (hover_animated && emote.animated) {
height = emote.height; pair = getBiggestImage(emote.animated);
if (pair)
hoverSrc = pair[0];
} }
} }
@ -2608,6 +2612,8 @@ export default class Chat extends Module {
src, src,
height: `${height}px`, height: `${height}px`,
alt: token.text, alt: token.text,
'data-normal-src': src,
'data-hover-src': hoverSrc,
'data-tooltip-type': 'emote', 'data-tooltip-type': 'emote',
'data-provider': token.provider, 'data-provider': token.provider,
'data-id': token.id, 'data-id': token.id,
@ -2906,3 +2912,16 @@ export default class Chat extends Module {
return data; return data;
} }
} }
function getBiggestImage(urls) {
if (urls?.[4] )
return [urls[4], 4];
if (urls?.[3] )
return [urls[3], 3];
if (urls?.[2] )
return [urls[2], 2];
if (urls?.[1] )
return [urls[1], 1];
return null;
}

View file

@ -20,7 +20,7 @@ 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'; import { isHighlightedReward, isMessageEffect } from './points';
/*const REGEX_EMOTES = { /*const REGEX_EMOTES = {
@ -370,6 +370,16 @@ export default class ChatHook extends Module {
} }
}); });
this.settings.add('chat.powerup.effects', {
default: true,
ui: {
path: 'Chat > Appearance >> Community',
title: 'Allow "Message Effects" messages to appear in chat.',
component: 'setting-check-box',
description: '*Note*: Only affects messages sent after you change this setting. You can use your own chat for testing.'
}
});
this.settings.add('channel.raids.blocked-channels', { this.settings.add('channel.raids.blocked-channels', {
default: [], default: [],
type: 'array_merge', type: 'array_merge',
@ -1899,7 +1909,7 @@ export default class ChatHook extends Module {
if ( blocked_types.has(types[msg.type]) ) if ( blocked_types.has(types[msg.type]) )
return; return;
if ( msg.type === types.ChannelPointsReward ) if ( msg.type === types.ChannelPointsReward && ! isMessageEffect(msg.reward) )
return; return;
if ( msg.type === types.RewardGift && ! t.chat.context.get('chat.bits.show-rewards') ) if ( msg.type === types.RewardGift && ! t.chat.context.get('chat.bits.show-rewards') )
@ -2945,11 +2955,25 @@ export default class ChatHook extends Module {
if ( reward ) { if ( reward ) {
const out = i.convertMessage(e); const out = i.convertMessage(e);
out.ffz_type = 'points'; if ( t.chat.context.get('chat.powerup.effects') && isMessageEffect(reward) && e.animationID ) {
out.ffz_reward = reward; return i.postMessageToCurrentChannel(e, {
out.ffz_reward_highlight = isHighlightedReward(reward); type: t.chat_types.ChannelPointsReward,
id: out.id,
displayName: out.user.userDisplayName,
login: out.user.userLogin,
reward: reward,
message: out,
userID: out.user.userID,
animationID: e.animationID
})
} else {
out.ffz_animation_id = e.animationID;
out.ffz_type = 'points';
out.ffz_reward = reward;
out.ffz_reward_highlight = isHighlightedReward(reward);
return i.postMessageToCurrentChannel(e, out); return i.postMessageToCurrentChannel(e, out);
}
} }
} catch(err) { } catch(err) {

View file

@ -12,7 +12,7 @@ import { has } from 'utilities/object';
import { KEYS, RERENDER_SETTINGS, UPDATE_BADGE_SETTINGS, UPDATE_TOKEN_SETTINGS } from 'utilities/constants'; import { KEYS, RERENDER_SETTINGS, UPDATE_BADGE_SETTINGS, UPDATE_TOKEN_SETTINGS } from 'utilities/constants';
import { print_duration } from 'utilities/time'; import { print_duration } from 'utilities/time';
import { getRewardTitle, getRewardCost, isGiantEmoteReward, doesRewardCostBits } from './points'; import { getRewardTitle, getRewardCost, isGiantEmoteReward, doesRewardCostBits, isMessageEffect } from './points';
import awaitMD, {getMD} from 'utilities/markdown'; import awaitMD, {getMD} from 'utilities/markdown';
const SUB_TIERS = { const SUB_TIERS = {

View file

@ -19,6 +19,10 @@ export function isGiantEmoteReward(reward) {
reward.prompt?.includes?.('FFZ:GE')); reward.prompt?.includes?.('FFZ:GE'));
} }
export function isMessageEffect(reward) {
return reward?.type === 'SEND_ANIMATED_MESSAGE';
}
export function getRewardCost(reward) { export function getRewardCost(reward) {
const is_bits = doesRewardCostBits(reward); const is_bits = doesRewardCostBits(reward);
if ( isAutomaticReward(reward) ) if ( isAutomaticReward(reward) )

View file

@ -1,4 +1,9 @@
.twitch-emote { .twitch-emote {
max-height: 64px; max-height: 64px;
max-width: 128px; max-width: 128px;
} }
.chat-line__message--ffz-giant-emote .twitch-emote {
max-height: 128px;
max-width: 256px;
}