From 21bc0a704f5f9f482b722611e5ab7c0c5c5d5f7b Mon Sep 17 00:00:00 2001 From: SirStendec Date: Mon, 27 Mar 2023 18:50:32 -0400 Subject: [PATCH] 4.44.0 * Added: Initial re-implementation of emote information cards. These have been broken for a while due to changes in Twitch's website preventing us from accessing them. * Added: Setting to hide charity progress elements in chat. * Changed: Emote tool-tips now display emote artists. * Changed: The `Chat Command` chat action can now optionally be sent in another channel. Note that when doing so, you will not receive feedback from your sent message. * Fixed: The 'Viewer Count' tool-tip duplicating itself. * Fixed: Emote menu repeatedly requesting FFZ data. * API Added: Ephemeral profiles can now be created by passing `ephemeral: true` in the options when creating a profile. These profiles are temporary and read-only. --- fontello.config.json | 14 + package.json | 2 +- res/font/ffz-fontello.eot | Bin 36012 -> 36332 bytes res/font/ffz-fontello.svg | 2 + res/font/ffz-fontello.ttf | Bin 35828 -> 36148 bytes res/font/ffz-fontello.woff | Bin 22164 -> 22388 bytes res/font/ffz-fontello.woff2 | Bin 18504 -> 18696 bytes src/experiments.json | 4 +- .../chat/actions/components/edit-chat.vue | 90 +++-- src/modules/chat/actions/types.jsx | 35 +- src/modules/chat/emote_info.gql | 5 + src/modules/chat/emotes.js | 243 +++++++++++-- src/modules/chat/index.js | 2 +- src/modules/chat/tokenizers.jsx | 195 ++++++++-- src/modules/emote_card/components/card.vue | 338 +++++++++++++++++ .../emote_card/components/report-form.vue | 257 +++++++++++++ src/modules/emote_card/index.jsx | 343 ++++++++++++++++++ src/modules/emote_card/twitch_data.gql | 65 ++++ .../main_menu/components/action-editor.vue | 20 +- .../main_menu/components/filter-editor.vue | 31 +- .../components/filter-rule-editor.vue | 6 +- .../main_menu/components/menu-page.vue | 17 + .../main_menu/components/profile-editor.vue | 29 ++ .../main_menu/components/profile-manager.vue | 10 + .../main_menu/components/profile-selector.vue | 8 + .../components/setting-check-box.vue | 15 +- .../components/setting-color-box.vue | 9 +- .../components/setting-combo-box.vue | 11 +- .../main_menu/components/setting-hotkey.vue | 9 +- .../components/setting-select-box.vue | 9 +- .../main_menu/components/setting-text-box.vue | 9 +- src/modules/main_menu/index.js | 4 +- src/modules/main_menu/setting-mixin.js | 9 + src/modules/metadata.jsx | 1 + src/settings/index.js | 2 +- src/settings/profile.js | 66 +++- .../css_tweaks/emote-alignment-baseline.scss | 3 + .../modules/chat/emote_menu.jsx | 59 ++- .../twitch-twilight/modules/chat/index.js | 36 +- .../twitch-twilight/modules/chat/input.jsx | 2 +- .../styles/emote-alignment-baseline.scss | 3 + .../twitch-twilight/modules/menu_button.jsx | 8 +- src/std-components/color-picker.vue | 8 + src/std-components/key-picker.vue | 17 +- src/utilities/constants.js | 61 ++++ src/utilities/ffz-icons.js | 3 +- styles/chat.scss | 6 + styles/fontello/ffz-fontello-codes.scss | 1 + styles/fontello/ffz-fontello-embedded.scss | 13 +- styles/fontello/ffz-fontello-ie7-codes.scss | 1 + styles/fontello/ffz-fontello-ie7.scss | 1 + styles/fontello/ffz-fontello.scss | 15 +- styles/main.scss | 18 + styles/native/text.scss | 1 + 54 files changed, 1955 insertions(+), 161 deletions(-) create mode 100644 src/modules/emote_card/components/card.vue create mode 100644 src/modules/emote_card/components/report-form.vue create mode 100644 src/modules/emote_card/index.jsx create mode 100644 src/modules/emote_card/twitch_data.gql diff --git a/fontello.config.json b/fontello.config.json index f284dc20..370a7dfd 100644 --- a/fontello.config.json +++ b/fontello.config.json @@ -881,6 +881,20 @@ "search": [ "fx" ] + }, + { + "uid": "3c736f432d2e3ec0d6b5d2f193b93345", + "css": "artist", + "code": 59470, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M200 500V535C200 685 320 800 465 800H535A95 95 0 0 0 630 705V690A150 150 0 0 1 680 585L770 500C790 480 800 455 800 430V400L880 320C895 355 900 390 900 430A200 200 0 0 1 835 575L750 660A50 50 0 0 0 735 690V705A195 195 0 0 1 535 900H470C270 900 105 735 105 535V500A400 400 0 0 1 505 100H575C675 100 760 140 825 210L805 225 705 325 605 405V450A150 150 0 0 1 455 600H300L335 565C350 550 360 525 360 500A150 150 0 0 1 510 350H545L625 250 650 225 660 215C630 205 605 200 570 200H500A300 300 0 0 0 200 500Z", + "width": 1000 + }, + "search": [ + "artist" + ] } ] } \ No newline at end of file diff --git a/package.json b/package.json index e2bf3c11..605972af 100755 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "frankerfacez", "author": "Dan Salvato LLC", - "version": "4.43.0", + "version": "4.44.0", "description": "FrankerFaceZ is a Twitch enhancement suite.", "private": true, "license": "Apache-2.0", diff --git a/res/font/ffz-fontello.eot b/res/font/ffz-fontello.eot index 22ce8442f9ced1c7b03ebe91cadd143377db3f3d..9797c95a4c022a4e689f61271dcd6d91dab2f6ab 100644 GIT binary patch delta 1236 zcmY+DUrbw79LK-s-u9Mlj1nj?9d>26^pE_rrGIez>$XzX1+k#5+Ks`50)nS$(TBx7;gM?j`C@W#p6m!rS?+FX>!r{)a=-~$eXpmwl!elLVQ$-)t08O0jVYG z_r$58C@;Q3`D@DNcp`l=>xyhrNc~ESema#LQPl3pW#Ek~^upbQa#9tbKLX4YCNNDa ziP83hLw``FNrfkBGL`NRFY16<%9@YV6Qk80Eyc7$bf#X{1)0Y;<29z)!! z)swf=_zh^-7u4Z_2^v(c_U7IfK5*Q`f6I3$lw1ERx53Nz*eba>@h5GP=9hAc=AWEN z)aC}Y(l&o#O?r~~Y3+G2v)T(3z>C0oHwPhdmV-X>G6((S6%Jk^f6l?nyklf6{5cvQH z3b~L843i6)zzBJg)_*ifAx8d?gHiG-2V-P9*8&(PZ*UMN|HZ)s`3VO!*W=wB94FHq zDu5~SHyk9$H#yijO_gssbRXyRq?5ihn`aLNtS#*6 zs;Dt!U^RQfJB2+hhpqdEBmEAi*Bu>51P(7a4Y8Q5%f2G-C?Uxqd6)gEKwrRbv$JDz zu%j)|V$~bHhOp6Q3^jGyd#c05WqNDS`wVkB`fDP?a$+Fr_CD{{$3hMEE}OhVE+@t0 zBAwml4f3&UUZm3ke(qkTPnp3ooc%O+<8aD@tO07=F82$ xxJq49u3I!QBhGSmti z1maDQL8ORqz^g90Fc7;j3$Y;cLPEhpC9O!Y=j=16^YS~t@A=N3_x$-*2IY|fId-HE z_}<$eTVR}YcANW;4~E|WQW*f3+pnm1^B=}Dj{$Mn?i)c1=eczjac62!z5crFUm<2E zW1?4SQ#qf^oKMGjn{PFgn#_BE_yxds&*xFw zj2;l+Jk1x;K{@?efD81L02TBn0WQ+>0`QBjE(%aZe-WUX{u(6=T;kxH0GH`a0r+*- z_}DtQLZ=9Dl{O1-jdlo7OP>(HMehQI<6Th4aiaikdYJv!hS{K=UJ}4V^H=Jif&M9g zm;NmP*Uj3t0M~)_eFE_2>s&TEXrkW=&`i$=;HTdSU}yofp@aj)+Hz^YYBqN}Cu@_6 zHjrfC({QC_E|~s05)2-e0@_HhMAA0eQ>2o|spix^Ysi*t8@0{awhoS_HKxs_pGx1# zD9@PBMCOnk_UBn;SyS2ThbnSXawc-~^3FOej%r7j<70ktbjby@%A17-DG+%Sn%7!y QH_6&!=NU<}hhLfg0HHDvn*aa+ diff --git a/res/font/ffz-fontello.svg b/res/font/ffz-fontello.svg index 84288f8a..89ee7da8 100644 --- a/res/font/ffz-fontello.svg +++ b/res/font/ffz-fontello.svg @@ -162,6 +162,8 @@ + + diff --git a/res/font/ffz-fontello.ttf b/res/font/ffz-fontello.ttf index 9c1a5f7e9dd9e2c21cc0692a00c0eff2fa4979a7..d350197991739bdcbdafed8e4342b6023b671650 100644 GIT binary patch delta 1208 zcmY+DZERCj7{~w5y)-GGOq0F*zyS}(L+x2C#S7GZY8Q4u)bud`BZtKQMuWP~0 zm(>J5E{)I+^73UN@e2@RxMb19L}Snx!v{q}h*2bjkVTOUf;uAvpYD9od-Ch={Li`P zoaUT!AHFYLIxW4YWUc@d0x&X`h^nV|>^jQ%BcQN->`1zX+xb~|n}3WG>SSWH>F+l= zFLErNjHXm>FXfzO7f#O1Pb@{=r~``b0#g^_)j}HHV^!@s8~ye{tqXrN?SA zl^zTqHvsdTb)TxU_)r5K zDpz*r?$QUYtN3sE0r_(6f8{zv`4Q_S_l5KeCAB5Fgo=9d3-OcGmUZXk%*t*c4_*RR z`veHFvjPmTPYE!{J|n=(>@Nk_!~RBqF#Bf#BJ3Li@RqLL7T{I(opmz6Yh3wVfFbrh z0eDMS{}f;!aKB7|VfID=_Oq)6IKXZZV1&I*fG9hk8H}>?nZX!)n%BQS%^}7bH-sHgy`#S*=?5hHl9OBCN0zQ(PMYTPd zEAlbv9-qOs?ykO;a#>g4E0bj1CW0*YLqdU0DwyKiAVVkfUn0uyASlWghX(qCz1!Qj zx|)<4uU=nOUtVFZvQQhjeI3+EUBvQNRv5`ddP9ZTDA|=QcAMSSK_0))@8kC>t4tY* zd#IlLo#gd&^58CN;<&}2H|W2%TIY8J?5*@n)sQ7*rrOQn5@~bmPWy|akwKT+?;RRW z1a>aC&9RuH*LgVsnWhQ&j z|17y(gSC-SB{4kY^}paX#X^nFUWc+lDQCr$LW9%M6M*(;SK3+~eA4~N0aN=QFv)yc zz|Fo>{8 zCmMVWCmOdl-fG&{e60D-^XFU<*JbxlEf-sU^^|&MJlA+)VpMJ7aGOkO?(EzRiC)*< Zoj)iU^wHV$R4T3g_EwNI?>nCv{{>mEMpgg- delta 904 zcmY+CT}V@59LAq>&I&Erq>B(*uy9MoY3jrx^`^8a49!d}D>vudQs+6iDJrO4W!N`^ zqJrq6AQGfFArW3g7=+!Jg_w}-BErBz#mq>t=j=78^XGSd@AICI|M_^I-j)|{%GZ*6 z-vCk>0Jk^j(az^yjc0xg#ASNh!#2)y>n`BV+@Se`b(z1qm`fNF{GO1;`9$ViI?mtR z*-&b>ZUN$>K;S~a=c%`Uko$qw0FUPdI1#5SmCW~;?SWvpqraqbZHyBmY&zVmdOdr; zR%HRzcHtaF>+**?0N2g@ssLw! zg>3@x<_lal256$+3eZfC3lOB=381t9`fU7;B0alQwOg%yC9i8O1wUX>_%vK;=~44v zM}|YYB~@Px6-#BibPPHs94k8qQyNnyQxBxBq?M;lrz8Eo6V8Vj zWf`NH3%e?^lCnm!b8-&5Y_4iok83KoD7NNQ{cd}{BB_z7&T0L5SCgzeyAMfvxaWoW E51?=k7XSbN diff --git a/res/font/ffz-fontello.woff b/res/font/ffz-fontello.woff index c2e1efb34c56860d57b0063302162ee44cbc9f09..5492c85cbd9cee3685d8f604d0a375c46315d99a 100644 GIT binary patch delta 19781 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
W+xsBW|^4XsaUY|PVS@*m4{bTX3{R(%d4NV)(3 delta 19496 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 L?{OjkllNAA_y8_S diff --git a/res/font/ffz-fontello.woff2 b/res/font/ffz-fontello.woff2 index 442e500aa2bfdcd893d016b735652b251c1daa19..58c24309f013853079083c34531a80bb6e93499f 100644 GIT binary patch literal 18696 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 DQ`OMz diff --git a/src/experiments.json b/src/experiments.json index 1fe1346c..a7ed1cce 100644 --- a/src/experiments.json +++ b/src/experiments.json @@ -3,8 +3,8 @@ "name": "Modular Chat Line Rendering", "description": "Enable a newer, modular chat line renderer.", "groups": [ - {"value": true, "weight": 20}, - {"value": false, "weight": 80} + {"value": true, "weight": 80}, + {"value": false, "weight": 20} ] }, "api_load": { diff --git a/src/modules/chat/actions/components/edit-chat.vue b/src/modules/chat/actions/components/edit-chat.vue index dae26f97..da13a63c 100644 --- a/src/modules/chat/actions/components/edit-chat.vue +++ b/src/modules/chat/actions/components/edit-chat.vue @@ -1,42 +1,68 @@ diff --git a/src/modules/chat/actions/types.jsx b/src/modules/chat/actions/types.jsx index 949cfb08..42e355d9 100644 --- a/src/modules/chat/actions/types.jsx +++ b/src/modules/chat/actions/types.jsx @@ -238,7 +238,10 @@ export const open_url = { editor: () => import(/* webpackChunkName: 'main-menu' */ './components/edit-url.vue'), title: 'Open URL', - description: '{options.url}', + description(data) { + return data.options.url; + }, + description_i18n: null, can_self: true, @@ -287,7 +290,20 @@ export const chat = { }, title: 'Chat Command', - description: '{options.command}', + description(data) { + if ( data.options.paste ) + return this.t('chat.actions.chat.desc.paste', 'Paste into chat: {cmd}', {cmd: data.options.command}) + + const target = data.options.target ?? ''; + + return this.t('chat.actions.chat.desc.target', 'Send in {target}: {cmd}', { + cmd: data.options.command, + target: /^\s*$/.test(target) + ? this.t('chat.actions.chat.desc.current', 'current channel') + : target + }); + }, + description_i18n: null, can_self: true, @@ -295,10 +311,15 @@ export const chat = { tooltip(data) { const msg = this.replaceVariables(data.options.command, data); + let target = this.replaceVariables(data.options.target ?? '', data); + if ( /^\s*$/.test(target) ) + target = null; return [ (
{ // eslint-disable-line react/jsx-key - this.i18n.t('chat.actions.chat', 'Chat Command') + target + ? this.i18n.t('chat.actions.chat.with-target', 'Chat Command in Channel: {target}', {target}) + : this.i18n.t('chat.actions.chat', 'Chat Command') }
), (
{ // eslint-disable-line react/jsx-key msg @@ -308,10 +329,14 @@ export const chat = { click(event, data) { const msg = this.replaceVariables(data.options.command, data); + let target = this.replaceVariables(data.options.target ?? '', data); + if ( data.options.paste || /^\s*$/.test(target) ) + target = data.room.login; + if ( data.options.paste ) - this.pasteMessage(data.room.login, msg); + this.pasteMessage(target, msg); else - this.sendMessage(data.room.login, msg); + this.sendMessage(target, msg); } } diff --git a/src/modules/chat/emote_info.gql b/src/modules/chat/emote_info.gql index 10b5232e..27f19241 100644 --- a/src/modules/chat/emote_info.gql +++ b/src/modules/chat/emote_info.gql @@ -1,6 +1,11 @@ query FFZ_GetEmoteInfo($id: ID!) { emote(id: $id) { id + artist { + id + login + displayName + } owner { id login diff --git a/src/modules/chat/emotes.js b/src/modules/chat/emotes.js index 689fcdda..aa854f7f 100644 --- a/src/modules/chat/emotes.js +++ b/src/modules/chat/emotes.js @@ -23,10 +23,10 @@ const Flags = make_enum_flags( 'FlipX', 'FlipY', 'GrowX', - 'GrowY', - 'ShrinkX', - 'ShrinkY', - 'Rotate45', + 'Slide', + 'Appear', + 'Leave', + 'Rotate', 'Rotate90', 'Greyscale', 'Sepia', @@ -42,6 +42,70 @@ export const MODIFIER_FLAGS = Flags; export const MODIFIER_KEYS = Object.values(MODIFIER_FLAGS).filter(x => typeof x === 'number'); +const APPEAR_FRAMES = [ + [0, -18, 0, 0], + [19.99, -18, 0, 0], + [20, -18, 0.1, 0], + [25, -16, 0.2, 0.6], + [30, -14, 0.3, -4], + [35, -12, 0.4, 0.6], + [40, -10, 0.5, -4], + [45, -8, 0.6, 2], + [50, -6, 0.7, -3], + [55, -4, 0.8, 2], + [60, -2, 0.9, -3], + [65, 0, 1, 0], + [100, 0, 1, 0] +]; + +const LEAVE_FRAMES = [ + [0, 0, 1, 0], + [39.99, 1, 1, 0], + [40, 0, -.9, .9, -3], + [45, -2, -.8, .8, 2], + [50, -4, -.7, .7, -3], + [55, -6, -.6, .6, 2], + [60, -8, -.5, .5, -4], + [65, -10, -.4, .4, .6], + [70, -12, -.3, .3, -4], + [75, -14, -.2, .2, .6], + [80, 16, -.1, .1, 0], + [85, -18, -0.01, 0, 0], + [100, -18, -0.01, 0, 0] +]; + + +function appearLeaveToKeyframes(source, multi = 1, offset = 0, has_var = false) { + const out = []; + + for(const line of source) { + const pct = (line[0] * multi) + offset; + + let vr, tx, scale, ty; + vr = has_var ? `var(--ffz-effect-transforms) ` : ''; + tx = line[1] === 0 ? '' : `translateX(${line[1]}px) `; + + if ( line.length === 4 ) { + scale = `scale(${line[2]})`; + ty = line[3] === 0 ? '' : ` translateY(${line[3]}px)`; + + } else { + const sx = line[2], + sy = line[3]; + + scale = `scale(${sx}, ${sy})`; + + ty = line[4] === 0 ? '' : ` translateY(${line[4]}px)`; + } + + out.push(`\t${pct}% { transform:${vr}${tx}${scale}${ty}; }`); + } + + return out.join('\n'); +} + + + const EFFECT_STYLES = [ { setting: 'FlipX', @@ -66,24 +130,87 @@ const EFFECT_STYLES = [ title: 'Stretch Horizontal' }, { - setting: 'ShrinkY', - flags: Flags.ShrinkY, - title: 'Squish Vertical' + setting: 'Slide', + flags: Flags.Slide, + //not_flags: Flags.Rotate, + title: 'Slide Animation', + as_background: true, + animation: 'ffz-effect-slide var(--ffz-speed-x) linear infinite', + raw: `@keyframes ffz-effect-slide { +0% { background-position-x: 0; } +100% { background-position-x: calc(-1 * var(--ffz-width)); } +}` }, { - setting: 'GrowY', - flags: Flags.GrowY, - title: 'Stretch Vertical' + setting: 'Appear', + flags: Flags.Appear, + not_flags: Flags.Leave, + title: 'Appear Animation', + animation: 'ffz-effect-appear 3s infinite linear', + animationTransform: 'ffz-effect-appear-transform 3s linear infinite', + raw: `@keyframes ffz-effect-appear { +${appearLeaveToKeyframes(APPEAR_FRAMES)} +} +@keyframes ffz-effect-appear-transform { +${appearLeaveToKeyframes(APPEAR_FRAMES, 1, 0, true)} +}` + }, + { + setting: 'Leave', + flags: Flags.Leave, + not_flags: Flags.Appear, + title: 'Leave Animation', + animation: 'ffz-effect-leave 3s infinite linear', + animationTransform: 'ffz-effect-leave-transform 3s infinite linear', + raw: `@keyframes ffz-effect-leave { +${appearLeaveToKeyframes(LEAVE_FRAMES)} +} +@keyframes ffz-effect-leave-transform { +${appearLeaveToKeyframes(LEAVE_FRAMES, 1, 0, true)} +}` + }, + { + setting: [ + 'Appear', + 'Leave' + ], + flags: Flags.Appear | Flags.Leave, + animation: 'ffz-effect-in-out 6s infinite linear', + animationTransform: 'ffz-effect-in-out-transform 6s linear infinite', + raw: `@keyframes ffz-effect-in-out { +${appearLeaveToKeyframes(APPEAR_FRAMES, 0.5, 0)} +${appearLeaveToKeyframes(LEAVE_FRAMES, 0.5, 50)} +} +@keyframes ffz-effect-in-out-transform { +${appearLeaveToKeyframes(APPEAR_FRAMES, 0.5, 0, true)} +${appearLeaveToKeyframes(LEAVE_FRAMES, 0.5, 50, true)} +}` + }, + { + setting: 'Rotate', + flags: Flags.Rotate, + not_flags: Flags.Slide, + title: 'Rotate Animation', + no_wide: true, + animation: 'ffz-effect-rotate 1.5s infinite linear', + animationTransform: 'ffz-effect-rotate-transform 1.5s infinite linear', + raw: `@keyframes ffz-effect-rotate { +0% { transform: rotate(0deg); } +100% { transform: rotate(360deg); } +} +@keyframes ffz-effect-rotate-transform { +0% { transform: var(--ffz-effect-transforms) rotate(0deg); } +100% { transform: var(--ffz-effect-transforms) rotate(360deg); } +}` }, /*{ - setting: 'Rotate45', - flags: MODIFIER_FLAGS.Rotate45, - title: 'Rotate 45 Degrees' - }, - { - setting: 'Rotate90', - flags: MODIFIER_FLAGS.Rotate90, - title: 'Rotate 90 Degrees' + setting: [ + 'Slide', + 'Rotate' + ], + flags: Flags.Rotate | Flags.Slide, + // Sync up the speed for slide and rotate if both are applied. + animation: 'ffz-effect-slide calc(1.5 * var(--ffz-speed-x)) linear infinite' }, { setting: 'Greyscale', @@ -242,7 +369,7 @@ const EFFECT_STYLES = [ function generateBaseFilterCss() { const out = [ - `.modified-emote[data-effects] > img { + `.modified-emote[data-effects] > .chat-line__message--emote { --ffz-effect-filters: none; --ffz-effect-transforms: initial; --ffz-effect-animations: initial; @@ -314,6 +441,7 @@ export default class Emotes extends Module { this.twitch_inventory_sets = new Set; //(EXTRA_INVENTORY); this.__twitch_emote_to_set = {}; this.__twitch_set_to_channel = {}; + this.__twitch_emote_to_artist = {}; // Bulk data structure for collections applied to a lot of users. // This lets us avoid allocating lots of individual user @@ -548,6 +676,9 @@ export default class Emotes extends Module { if ( (flags & input.flags) !== input.flags ) continue; + if ( input.not_flags && (flags & input.not_flags) === input.not_flags ) + continue; + if ( input.animation ) animations.push(input); @@ -584,7 +715,7 @@ export default class Emotes extends Module { if ( ! filter && ! transform && ! animation ) return null; - return `.modified-emote[data-effects="${flags}"] > img {${filter ? ` + return `.modified-emote[data-effects="${flags}"] > .chat-line__message--emote {${filter ? ` --ffz-effect-filters: ${filter}; filter: var(--ffz-effect-filters);` : ''}${transformOrigin ? ` transform-origin: ${transformOrigin};` : ''}${transform ? ` @@ -602,6 +733,9 @@ export default class Emotes extends Module { this.effects_enabled = {}; this.activeEffectStyles = []; + this.activeAsBackgroundMask = 0; + this.activeNoWideMask = 0; + for(const input of EFFECT_STYLES) { if ( input.setting && ! Array.isArray(input.setting) ) this.effects_enabled[input.setting] = this.parent.context.get(`chat.effects.${input.setting}`); @@ -619,8 +753,14 @@ export default class Emotes extends Module { } else if ( input.setting ) enabled = this.effects_enabled[input.setting]; - if ( enabled ) + if ( enabled ) { this.activeEffectStyles.push(input); + + if ( input.as_background ) + this.activeAsBackgroundMask = this.activeAsBackgroundMask | input.flags; + if ( input.no_wide ) + this.activeNoWideMask = this.activeNoWideMask | input.flags; + } } this.effect_style.clear(); @@ -820,10 +960,14 @@ export default class Emotes extends Module { this.settings.provider.set(key, favs); } - handleClick(event) { + handleClick(event, favorite_only = false) { const target = event.target, ds = target && target.dataset; + /*const modified = target.closest('.modified-emote'); + if ( modified && modified !== target ) + return;*/ + if ( ! ds ) return; @@ -928,9 +1072,14 @@ export default class Emotes extends Module { return true; } + if ( favorite_only ) + return false; + const evt = new FFZEvent({ provider, id: ds.id, + set: ds.set, + name: ds.name || target.alt, source: event }); @@ -1504,6 +1653,18 @@ export default class Emotes extends Module { } } + // Check to see if this emote applies any effects with as_background. + /*let as_background = false; + if ( emote.modifier_flags ) { + for(const input of EFFECT_STYLES) + if ( (emote.modifier_flags & input.flags) === input.flags ) { + if ( input.as_background ) { + as_background = true; + break; + } + } + }*/ + emote.token = { type: 'emote', id: emote.id, @@ -1524,7 +1685,8 @@ export default class Emotes extends Module { length: emote.name.length, height: emote.height, width: emote.width, - source_modifier_flags: emote.modifier_flags ?? 0 + source_modifier_flags: emote.modifier_flags ?? 0, + //effect_bg: as_background }; if ( has(MODIFIERS, emote.id) ) @@ -1746,7 +1908,7 @@ export default class Emotes extends Module { } if ( emote.modifier && emote.mask?.[1] ) { - output = (output || '') + `.modified-emote[data-modifiers~="${emote.id}"] > img { + output = (output || '') + `.modified-emote[data-modifiers~="${emote.id}"] > .chat-line__message--emote { -webkit-mask-image: url("${emote.mask[1]}"); -webkit-mask-position: center center; }` @@ -1790,9 +1952,10 @@ export default class Emotes extends Module { this.__twitch_set_to_channel[set_id] = channel; } - _getTwitchEmoteSet(emote_id) { + _getTwitchEmoteSet(emote_id, need_artist = false) { const tes = this.__twitch_emote_to_set, - tsc = this.__twitch_set_to_channel; + tsc = this.__twitch_set_to_channel, + tsa = this.__twitch_emote_to_artist; if ( typeof emote_id === 'number' ) { if ( isNaN(emote_id) || ! isFinite(emote_id) ) @@ -1801,7 +1964,7 @@ export default class Emotes extends Module { emote_id = `${emote_id}`; } - if ( has(tes, emote_id) ) { + if ( has(tes, emote_id) && (! need_artist || has(tsa, emote_id)) ) { const val = tes[emote_id]; if ( Array.isArray(val) ) return new Promise(s => val.push(s)); @@ -1829,6 +1992,10 @@ export default class Emotes extends Module { if ( emote ) { set_id = emote.setID; + if ( emote.id && ! has(tsa, emote.id) ) { + tsa[emote.id] = emote.artist; + } + if ( set_id && ! has(tsc, set_id) ) { const type = determineEmoteType(emote); @@ -1860,6 +2027,28 @@ export default class Emotes extends Module { return promise; } + _getTwitchEmoteArtist(emote_id) { + const tsa = this.__twitch_emote_to_artist; + + if ( has(tsa, emote_id) ) + return Promise.resolve(tsa[emote_id]); + + return this._getTwitchEmoteSet(emote_id, true) + .then(() => tsa[emote_id]) + .catch(() => { + tsa[emote_id] = null; + return null; + }); + } + + getTwitchEmoteArtist(emote_id, callback) { + const promise = this._getTwitchEmoteArtist(emote_id); + if ( callback ) + promise.then(callback); + else + return promise; + } + _getTwitchSetChannel(set_id) { const tsc = this.__twitch_set_to_channel; diff --git a/src/modules/chat/index.js b/src/modules/chat/index.js index e202094d..40ec9d16 100644 --- a/src/modules/chat/index.js +++ b/src/modules/chat/index.js @@ -1864,7 +1864,7 @@ export default class Chat extends Module { className: 'chat-author__intl-login' }, ` (${user.login})`)); - return [out]; + return out; } diff --git a/src/modules/chat/tokenizers.jsx b/src/modules/chat/tokenizers.jsx index 86083dc2..d742ebbb 100644 --- a/src/modules/chat/tokenizers.jsx +++ b/src/modules/chat/tokenizers.jsx @@ -7,17 +7,16 @@ import {sanitize, createElement} from 'utilities/dom'; import {has, getTwitchEmoteURL, split_chars, getTwitchEmoteSrcSet} from 'utilities/object'; -import {EmoteTypes, REPLACEMENT_BASE, REPLACEMENTS} from 'utilities/constants'; +import {EmoteTypes, REPLACEMENT_BASE, REPLACEMENTS, WEIRD_EMOTE_SIZES} from 'utilities/constants'; import {CATEGORIES, JOINER_REPLACEMENT} from './emoji'; import { MODIFIER_FLAGS } from './emotes'; const SHRINK_X = MODIFIER_FLAGS.ShrinkX, - STRETCH_X = MODIFIER_FLAGS.GrowX, - SHRINK_Y = MODIFIER_FLAGS.ShrinkY, - STRETCH_Y = MODIFIER_FLAGS.GrowY, - ROTATE_45 = MODIFIER_FLAGS.Rotate45, - ROTATE_90 = MODIFIER_FLAGS.Rotate90; + SLIDE_X = MODIFIER_FLAGS.Slide, + STRETCH_X = MODIFIER_FLAGS.GrowX; + //SHRINK_Y = MODIFIER_FLAGS.ShrinkY, + //STRETCH_Y = MODIFIER_FLAGS.GrowY, const EMOTE_CLASS = 'chat-image chat-line__message--emote', @@ -1227,7 +1226,10 @@ export const AddonEmotes = { effects = token.modifier_flags, is_big = (token.big && ! token.can_big && token.height); - if ( effects || ml ) { + let as_bg = (this.emotes.activeAsBackgroundMask & effects) !== 0; + let no_wide = (this.emotes.activeNoWideMask & effects) !== 0; + + if ( no_wide || effects || ml ) { // We need to calculate the size of the emote and the biggest // modifier so that everything can be nicely centered. if ( token.provider === 'emoji' ) { @@ -1243,7 +1245,7 @@ export const AddonEmotes = { height: size }; } else { - const factor = big ? 2 : 1; + const factor = token.big ? 2 : 1; style = { width: token.width * factor, height: token.height * factor @@ -1255,6 +1257,9 @@ export const AddonEmotes = { } for(const mod of mods) { + if ( mod.effect_bg ) + as_bg = true; + if ( ! mod.hidden && mod.set !== 'info' ) { const factor = mod.big ? 2 : 1, width = mod.width * factor, @@ -1274,27 +1279,71 @@ export const AddonEmotes = { style.width *= 0.5; if ( (effects & STRETCH_X) === STRETCH_X ) style.width *= 2; - if ( (effects & SHRINK_Y) === SHRINK_Y ) + /*if ( (effects & SHRINK_Y) === SHRINK_Y ) style.height *= 0.5; if ( (effects & STRETCH_Y) === STRETCH_Y ) - style.height *= 2; + style.height *= 2;*/ - style.width = Math.min(style.width, big ? 256 : 128); - style.height = Math.min(style.height, big ? 80 : 40); - - if ( style.width > outerStyle.width ) - outerStyle.width = style.width; - if ( style.height > outerStyle.height ) - outerStyle.height = style.height; + style.width = Math.min(style.width, token.big ? 256 : 128); + style.height = Math.min(style.height, token.big ? 80 : 40); } + if ( no_wide ) { + const limit = token.big ? 64 : 32; + if ( style.width > limit ) { + const factor = limit / style.width; + style.width *= factor; + style.height *= factor; + } + } + + if ( style.width > outerStyle.width ) + outerStyle.width = style.width; + if ( style.height > outerStyle.height ) + outerStyle.height = style.height; + if ( style.width !== outerStyle.width ) style.marginLeft = (outerStyle.width - style.width) / 2; if ( style.height !== outerStyle.height ) style.marginTop = (outerStyle.height - style.height) / 2; + + if ( effects ) { + if ( (effects & SLIDE_X) === SLIDE_X ) { + style['--ffz-width'] = `${style.width}px`; + style['--ffz-speed-x'] = `${0.5 * (style.width / (token.big ? 64 : 32))}s`; + } + } } - const emote = ( x.id).join(' ') : null} + data-modifier-info={ml ? JSON.stringify(mods.map(x => [x.set, x.id])) : null} + onClick={this.emotes.handleClick} + >
{ token.text }
); + } + + else + emote = ( x.id).join(' ') : null} data-effects={effects ? effects : undefined} - onClick={this.emotes.handleClick} + //onClick={this.emotes.handleClick} > {emote} {mods.map(t => { - if ( (t.source_modifier_flags & 1) === 1 || t.set === 'info') + if (t.set === 'info') return null; - return - {this.tokenizers.emote.render.call(this, t, createElement, true)} - + if ((t.source_modifier_flags & 1) === 1 && t.text) + return null; + // This is currently weird and breaks copy/paste + // so since it doesn't *fix* copy/paste just leave + // it out for now. + //return
{` ${t.text}`}
; + return {this.tokenizers.emote.render.call(this, t, createElement, true)} })} ); }, @@ -1350,7 +1403,7 @@ export const AddonEmotes = { provider = ds.provider, modifiers = ds.modifierInfo; - let name, preview, source, owner, mods, fav_source, emote_id, + let name, preview, source, artist, owner, mods, fav_source, emote_id, plain_name = false; const hide_source = ds.noSource === 'true'; @@ -1377,11 +1430,15 @@ export const AddonEmotes = { if ( provider === 'twitch' ) { emote_id = ds.id; const set_id = hide_source ? null : await this.emotes.getTwitchEmoteSet(emote_id), - emote_set = set_id != null && await this.emotes.getTwitchSetChannel(set_id); + emote_set = set_id != null && await this.emotes.getTwitchSetChannel(set_id), + raw_artist = hide_source ? null : await this.emotes.getTwitchEmoteArtist(emote_id); preview = `${getTwitchEmoteURL(ds.id, 4, true, true)}?_=preview`; fav_source = 'twitch'; + if ( raw_artist ) + artist = raw_artist.displayName || raw_artist.login; + if ( emote_set ) { const type = emote_set.type; if ( type === EmoteTypes.Global ) { @@ -1435,6 +1492,9 @@ export const AddonEmotes = { if ( emote ) { emote_id = emote.id; + if ( emote.artist ) + artist = emote.artist.display_name || emote.artist.name; + if ( emote.owner ) owner = this.i18n.t( 'emote.owner', 'By: {owner}', @@ -1467,6 +1527,15 @@ export const AddonEmotes = { height: (target.height ?? 28) * 2 }; + let outerStyle = { + width: style.width, + height: style.height + }; + + + let as_bg = (this.emotes.activeAsBackgroundMask & effects) !== 0; + let no_wide = (this.emotes.activeNoWideMask & effects) !== 0; + let changed = false; if ( (effects & SHRINK_X) === SHRINK_X ) { @@ -1477,14 +1546,14 @@ export const AddonEmotes = { style.width *= 2; changed = true; } - if ( (effects & SHRINK_Y) === SHRINK_Y ) { + /*if ( (effects & SHRINK_Y) === SHRINK_Y ) { style.height *= 0.5; changed = true; } if ( (effects & STRETCH_Y) === STRETCH_Y ) { style.height *= 2; changed = true; - } + }*/ if ( changed ) { if ( style.width > 512 ) @@ -1493,9 +1562,41 @@ export const AddonEmotes = { style.height = 160; } + if ( no_wide ) { + const limit = 64; + if ( style.width > limit ) { + const factor = limit / style.width; + style.width *= factor; + style.height *= factor; + } + } + + if ( style.width > outerStyle.width ) + outerStyle.width = style.width; + if ( style.height > outerStyle.height ) + outerStyle.height = style.height; + + if ( style.width !== outerStyle.width ) + style.marginLeft = (outerStyle.width - style.width) / 2; + if ( style.height !== outerStyle.height ) + style.marginTop = (outerStyle.height - style.height) / 2; + + if ( (effects & SLIDE_X) === SLIDE_X ) { + style['--ffz-width'] = `${style.width}px`; + style['--ffz-speed-x'] = `${0.5 * style.width / 64}s`; + } + style.width = `${style.width}px`; style.height = `${style.height}px`; + outerStyle.width = `${outerStyle.width}px`; + outerStyle.height = `${outerStyle.height}px`; + + if ( as_bg ) { + style.backgroundImage = `url("${target.src}")`; + style.backgroundSize = '100%'; + } + // Whip up a special preview. preview = (
- + {as_bg + ?
+ : + }
); } @@ -1572,6 +1679,13 @@ export const AddonEmotes = { {owner}
), + artist && this.context.get('tooltip.emote-sources') && (
+ {this.i18n.t( + 'emote.artist', 'Artist: {artist}', + {artist} + )} +
), + ds.sellout && (
{ds.sellout}
), mods && (
{mods}
), @@ -1901,6 +2015,11 @@ export const TwitchEmotes = { } } + const sizes = WEIRD_EMOTE_SIZES[e_id]; + + const width = sizes ? sizes[0] : 28, + height = sizes ? sizes[1] : 28; + out.push({ type: 'emote', id: e_id, @@ -1916,8 +2035,8 @@ export const TwitchEmotes = { anim, big, can_big, - width: 28, - height: 28, // Not always accurate but close enough. + width, + height, text: text.slice(e_start - t_start, e_end - t_start).join(''), modifiers: [], modifier_flags: 0 diff --git a/src/modules/emote_card/components/card.vue b/src/modules/emote_card/components/card.vue new file mode 100644 index 00000000..cc694842 --- /dev/null +++ b/src/modules/emote_card/components/card.vue @@ -0,0 +1,338 @@ + + + \ No newline at end of file diff --git a/src/modules/emote_card/components/report-form.vue b/src/modules/emote_card/components/report-form.vue new file mode 100644 index 00000000..2c841b28 --- /dev/null +++ b/src/modules/emote_card/components/report-form.vue @@ -0,0 +1,257 @@ +