From 463c9f9a458add7786cc79ccb4d8e93d40521a7b Mon Sep 17 00:00:00 2001 From: SirStendec Date: Wed, 12 Aug 2020 16:10:06 -0400 Subject: [PATCH] 4.20.28 * Added: Support for Twitch's replies and threads system. The experiment is currently disabled, but if it returns we want to support it. * Added: Option to automatically skip channel trailers. * Fixed: Incorrect appearance of aspect-ratio controlled elements, due to Twitch removing their aspect ratio CSS. * Fixed: Incorrect color applied to text buttons with a custom accent color set. * API Added: `chat:get-tab-commands` event for adding custom chat commands to tab-completion. * API Added: `reply` icon. --- fontello.config.json | 6 + package.json | 2 +- res/font/ffz-fontello.eot | Bin 31628 -> 31836 bytes res/font/ffz-fontello.svg | 2 + res/font/ffz-fontello.ttf | Bin 31444 -> 31652 bytes res/font/ffz-fontello.woff | Bin 19604 -> 19748 bytes res/font/ffz-fontello.woff2 | Bin 16356 -> 16448 bytes src/main.js | 2 + src/modules/chat/actions/index.jsx | 19 +- src/modules/chat/actions/types.jsx | 49 ++++++ src/modules/chat/index.js | 43 ++++- src/modules/chat/tokenizers.jsx | 55 ++++++ src/sites/twitch-twilight/modules/channel.jsx | 36 ++++ .../twitch-twilight/modules/chat/index.js | 13 +- .../twitch-twilight/modules/chat/input.jsx | 83 ++++++++- .../twitch-twilight/modules/chat/line.js | 162 +++++++++++++++++- .../twitch-twilight/modules/theme/index.js | 2 +- src/sites/twitch-twilight/styles/chat.scss | 21 +++ src/socket.js | 1 - src/std-components/aspect.vue | 6 +- src/utilities/ffz-icons.js | 3 +- src/utilities/rich_tokens.js | 4 +- styles/chat.scss | 2 +- 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/icons.scss | 4 + styles/main.scss | 30 ++++ 30 files changed, 536 insertions(+), 40 deletions(-) diff --git a/fontello.config.json b/fontello.config.json index b2c3e9d1..2a121afa 100644 --- a/fontello.config.json +++ b/fontello.config.json @@ -753,6 +753,12 @@ "css": "volume-off", "code": 59461, "src": "elusive" + }, + { + "uid": "c6be5a58ee4e63a5ec399c2b0d15cf2c", + "css": "reply", + "code": 61714, + "src": "fontawesome" } ] } \ No newline at end of file diff --git a/package.json b/package.json index fae76293..153672e6 100755 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "frankerfacez", "author": "Dan Salvato LLC", - "version": "4.20.27", + "version": "4.20.28", "description": "FrankerFaceZ is a Twitch enhancement suite.", "license": "Apache-2.0", "scripts": { diff --git a/res/font/ffz-fontello.eot b/res/font/ffz-fontello.eot index cd2699011dce728dbfb0aa0423fa0316bf6d5a9a..5f278bb01fb8bd500f37725305cd7dd67fc025f6 100644 GIT binary patch delta 948 zcmY+COH5Ni6o&t~j}}^@SPQ7s+VCi13o5jQL_rh@3p75^iaf+pE^V~64G@I@VZ*{0 zg5q`IBhd{pCK`j*l_7@sB(6k_Vl*a3C0&TQG#ZTW1GCY4^4)*_Gc$MQ&Y8hE_U0SY zHTD7{J;OSWXj+2t$u{&_)(30m}2DB|~R8*wLqKphQu9QJiZ*<^|e1arvSj`+e#S!L4~@>>Dn zS2WVmd8~J|9XL#0+7xY9q8~Rq#(*A+I?5W@aWzE?XBvP)l0O!5-2r z9PA}M$bpyC$H6|*Lmbdy&R*q!sy7?wpq_M&(}D(SeB+>z^alq`q`x>g03@iK^PrjZ z2?w-+#3To_fy7e|T1cO9=s%~DC#(9Y6n}1raj_5%Kl^yrfEE7t$t9kLpuP};qaKP(*r|HHn=u7puQo>qe<4P5q z?^LD0OhI|}g{#;aTM^tK bvR2i5_@Tg*m?bnI$aITC-LXqYW>WqFz<~wd delta 740 zcmY+BT}V@57{~wb&RW_AMi3-QoC`JG$39)A4Z|NFuFoO22#mRwj2L!6<(quI5m&D;+c_4U$HsoT`pvpljNdrS2%46nXR}_;jXmxzhh?61-lZQc6U4Nf#QF zHhoDE1!Ik=+=ZS#ZRP1vU2CRaOrudozYNq&xgC0O# zte$bIXF8`g)-PwW*6x};KVTH78{or1OZkn1ZkB-f%%oq(X2Wjy{uE^_@e1A4#egf diff --git a/res/font/ffz-fontello.svg b/res/font/ffz-fontello.svg index 63608d1f..1ffc6136 100644 --- a/res/font/ffz-fontello.svg +++ b/res/font/ffz-fontello.svg @@ -166,6 +166,8 @@ + + diff --git a/res/font/ffz-fontello.ttf b/res/font/ffz-fontello.ttf index fa3537baebca28e810c012d4dba3efd28596f6de..8694f59b6bec506180c02b7a5e7421a4fb3d9bdc 100644 GIT binary patch delta 920 zcmY+CTTBx{6o&uV-O|#cU@f2#Ys008EyO?zB+5mR@BkVWEXYMHZD|A4Zh&}+5?+Wg zgm9}5UJ`sE#wamreKN!tFGzR-B#JRHAu9Gk%+hEi-Ve-+?#Z|R{AXr%X6MY@S2p^M z4W@Lr0qh_Ehs*DjhcC8FkiP+_`&=hGO;N9ZUI7Aq)Ng8*z5d>z!K38I0G;f0cF2^E zBi}=+@wT05)?BK*4Mf|3`h1_q>E2@XZ2>&A26BCr(1gTt@}uNaeg4kV&O*nZmz0>K zMF-mgE@#E4Jpy=ZXuy=;d0J*OF+sqWO5SwB>Gu?rG<+ey4-kIIfsW2o=kBxvt>mR5 zx!ogw*kc(7&L$15)UgY}D&{Sk2cyYgvk=!>R#GiZpNGV*Q-=*ENHBy;!lg=?(yv@r zt}4%zx5|5EQTe>A53Vpf(+91>emi}HMnCv3#<3a?|A|N7@fd3nyeT|qu8=IQW6}3l zH$smqbY6NQcI$y<0*6R9ad4P4iGxbg91f~T_i}KA^f(6&QYQ!1q%9oK0WRO-fGV~e z=Af4J8>b0%)L7x5p7aL?4Wz#~I0i(hgsY&DbeaR&KxBpk+CXHMgC^1!9QsdF^h{|t zo&TS^Vpz8?*uw4axb14o6;>!4&=boleKL z>XJ4I)-KjxYg}l!Ch6lOZHz``5Y5~2Ym0Xp^-%-s6Lid|HEQW)h#goc4=D$p#wSgB zQf!T}yT3vw(!l|5s)y;8uIa1bv^$TvLmE#hTkQ;1G%sZqrc9-NO6yHqH20-vr;lx) z%dllcc8plGR-^TMW_D&x=DjSc>e~Hthnl>*MCJ~Tv`h%h6LPoq2r9a{ZD&Fs{Yx=_ E0gUqh=Kufz delta 722 zcmY+BT}V@57{~wb&ajz-N(d6YIFOp|Bd|<^+C|AILi)62ZOe|wvomy?ha6%NN)QAg zH8~M|2wfx;)J+{PB!&gz+SSmCAR2aKF+$>OB}!%WY%c_zhabQ9|9?i=A9F?>ij)z{#kAQW9@?cynd;jY$5KGd!7}C_}wXwu$%2}X7Q>6io<~LHF zB-_-;g^=fWAPtm@fPXZsNIlh6x9f8GI#jV>LH z^vjYsygLJgZqkNyR2tIQoLvXh0A(>IMHNq5@H^#8fMreVABcaM)Z(_7>>c4u9VkQ68G^5J+aKl35xZ|K>(wTNm ixUz1GJK#>0exYnQ!g~ZJ>!H4su|0CdVob%B?0*4@XWd=^ diff --git a/res/font/ffz-fontello.woff b/res/font/ffz-fontello.woff index 604d617f5363e4e11d1425fef7c0d185ec80d008..fe3639b389bc84a26107200c07ef837f48fc3f8d 100644 GIT binary patch delta 16264 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 delta 16078 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 UkpKVyc${PK-obDpD3h^FbNRU=Q2+n{ diff --git a/res/font/ffz-fontello.woff2 b/res/font/ffz-fontello.woff2 index 2c36f99608820ab07665a59d4dc4e26013701341..3a7ec52a12398ca9a4cbf38f40037b2017cb0316 100644 GIT binary patch literal 16448 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 azh3{Ei)Xj`IS~8X{_@};{gW*00{{S^gBZU6 literal 16356 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 n.setMessageTray && n.props && n.props.message) : null; + + if ( ! line ) + return; + + line.ffzOpenReply(); + //line.setMessageTray(line.props.message, line.props.message.message); + } +} + + // ============================================================================ // Edit Overrides // ============================================================================ diff --git a/src/modules/chat/index.js b/src/modules/chat/index.js index 1a5248b3..81e965b2 100644 --- a/src/modules/chat/index.js +++ b/src/modules/chat/index.js @@ -50,6 +50,7 @@ export default class Chat extends Module { // Bind for JSX stuff this.clickToReveal = this.clickToReveal.bind(this); this.handleMentionClick = this.handleMentionClick.bind(this); + this.handleReplyClick = this.handleReplyClick.bind(this); this.style = new ManagedStyle; @@ -1073,6 +1074,19 @@ export default class Chat extends Module { } + handleReplyClick(event) { + const target = event.target, + fine = this.resolve('site.fine'); + + if ( ! target || ! fine ) + return; + + const chat = fine.searchParent(target, n => n.props && n.props.reply && n.setOPCardTray); + if ( chat ) + chat.setOPCardTray(chat.props.reply); + } + + handleMentionClick(event) { if ( ! this.context.get('chat.filtering.clickable-mentions') ) return; @@ -1087,7 +1101,7 @@ export default class Chat extends Module { if ( ! fine ) return; - const chat = fine.searchParent(event.target, n => n.props && n.props.onUsernameClick); + const chat = fine.searchParent(target, n => n.props && n.props.onUsernameClick); if ( ! chat ) return; @@ -1174,6 +1188,25 @@ export default class Chat extends Module { } + tokenizeReply(reply) { + if ( ! reply ) + return null; + + return [ + { + type: 'reply', + text: reply.parentDisplayName, + color: this.color_cache ? this.color_cache.get(reply.parentUserLogin) : null, + recipient: reply.parentUserLogin + }, + { + type: 'text', + text: ' ' + } + ]; + } + + standardizeMessage(msg) { // eslint-disable-line class-methods-use-this if ( ! msg ) return msg; @@ -1487,7 +1520,7 @@ export default class Chat extends Module { } - renderTokens(tokens, e) { + renderTokens(tokens, e, reply) { if ( ! e ) e = createElement; @@ -1505,6 +1538,10 @@ export default class Chat extends Module { let res; + // If we have a reply, skip the initial mention. + if ( reply && i === 0 && type === 'mention' && token.recipient && token.recipient === reply.parentUserLogin ) + continue; + if ( type === 'text' ) res = e('span', { className: 'text-fragment', @@ -1512,7 +1549,7 @@ export default class Chat extends Module { }, token.text); else if ( tk ) - res = tk.render.call(this, token, e); + res = tk.render.call(this, token, e, reply); else res = e('em', { diff --git a/src/modules/chat/tokenizers.jsx b/src/modules/chat/tokenizers.jsx index e5506f13..0bce585f 100644 --- a/src/modules/chat/tokenizers.jsx +++ b/src/modules/chat/tokenizers.jsx @@ -232,6 +232,61 @@ Links.tooltip.delayHide = function(target) { }*/ +// ============================================================================ +// Replies (Styled Like Mentions) +// ============================================================================ + +export const Replies = { + type: 'reply', + priority: 0, + + component: () => null, + + render(token, createElement) { + let color = token.color; + if ( color ) { + const chat = this.resolve('site.chat'); + color = chat ? chat.colors.process(color) : color; + } + + return ( + {token.text} + ) + }, + + tooltip(target) { + const fine = this.resolve('site.fine'); + if ( ! target || ! fine ) + return null; + + const chat = fine.searchParent(target, n => n.props && n.props.reply && n.setOPCardTray), + reply = chat?.props?.reply; + if ( ! reply ) + return null; + + return [ + createElement('strong', {}, this.i18n.t('chat.reply-to', 'Replying To:')), + '\n\n', + createElement('div', {className: 'tw-align-left'}, [ + createElement('strong', {}, reply.parentDisplayName), + ': ', + reply.parentMessageBody + ]) + ]; + }, + + process(tokens) { + return tokens; + } +} + + // ============================================================================ // Mentions // ============================================================================ diff --git a/src/sites/twitch-twilight/modules/channel.jsx b/src/sites/twitch-twilight/modules/channel.jsx index 167eb559..e9edecd9 100644 --- a/src/sites/twitch-twilight/modules/channel.jsx +++ b/src/sites/twitch-twilight/modules/channel.jsx @@ -46,6 +46,20 @@ export default class Channel extends Module { } }); + this.settings.add('channel.auto-skip-trailer', { + default: false, + ui: { + path: 'Channel > Behavior >> General', + title: 'Automatically skip channel trailers.', + component: 'setting-check-box' + }, + + changed: val => { + if ( val ) + this.ChannelTrailer.each(el => this.maybeSkipTrailer(el)); + } + }) + this.settings.add('channel.auto-click-chat', { default: false, ui: { @@ -83,6 +97,13 @@ export default class Channel extends Module { ); + this.ChannelTrailer = this.elemental.define( + 'channel-trailer', '.channel-trailer-player__wrapper', + USER_PAGES, + {attributes: true}, 1 + ); + + this.ChannelRoot = this.elemental.define( 'channel-root', '.channel-root', USER_PAGES, @@ -115,6 +136,10 @@ export default class Channel extends Module { this.on('i18n:update', this.updateLinks, this); + this.ChannelTrailer.on('mount', this.maybeSkipTrailer, this); + this.ChannelTrailer.on('update', this.maybeSkipTrailer, this); + this.ChannelTrailer.each(el => this.maybeSkipTrailer(el)); + this.ChannelPanels.on('mount', this.updatePanelTips, this); this.ChannelPanels.on('update', this.updatePanelTips, this); this.ChannelPanels.on('unmount', this.removePanelTips, this); @@ -139,6 +164,17 @@ export default class Channel extends Module { this.checkNavigation(); } + maybeSkipTrailer(el) { + if ( ! this.settings.get('channel.auto-skip-trailer') ) + return; + + const inst = this.fine.searchParent(el, n => n.props && n.props.onDismiss); + if ( inst ) { + this.log.info('Automatically skipping channel trailer.'); + inst.props.onDismiss(); + } + } + updatePanelTips(inst) { if ( ! inst ) { for(const inst of this.ChannelPanels.instances) { diff --git a/src/sites/twitch-twilight/modules/chat/index.js b/src/sites/twitch-twilight/modules/chat/index.js index 3fa02369..58294e4e 100644 --- a/src/sites/twitch-twilight/modules/chat/index.js +++ b/src/sites/twitch-twilight/modules/chat/index.js @@ -1682,9 +1682,11 @@ export default class ChatHook extends Module { this._ffz_installed = true; const inst = this, - old_send = this.sendMessage; + old_send = this.sendMessage, + addMessage = (...args) => inst.addMessage(...args), + sendMessage = (msg, extra) => inst.sendMessage(msg, extra); - inst.sendMessage = function(msg) { + inst.sendMessage = function(msg, extra) { msg = msg.replace(/\s+/g, ' '); if ( msg.startsWith('/ffz') ) { @@ -1698,7 +1700,10 @@ export default class ChatHook extends Module { const event = new FFZEvent({ message: msg, - channel: inst.props.channelLogin + extra, + channel: inst.props.channelLogin, + addMessage, + sendMessage }); t.emit('chat:pre-send-message', event); @@ -1706,7 +1711,7 @@ export default class ChatHook extends Module { if ( event.defaultPrevented ) return; - return old_send.call(this, event.message); + return old_send.call(this, event.message, event.extra); } } diff --git a/src/sites/twitch-twilight/modules/chat/input.jsx b/src/sites/twitch-twilight/modules/chat/input.jsx index 77edb9a2..bb477461 100644 --- a/src/sites/twitch-twilight/modules/chat/input.jsx +++ b/src/sites/twitch-twilight/modules/chat/input.jsx @@ -6,9 +6,10 @@ import Module from 'utilities/module'; import { findReactFragment } from 'utilities/dom'; -import { TWITCH_POINTS_SETS, TWITCH_GLOBAL_SETS, TWITCH_PRIME_SETS, KNOWN_CODES, REPLACEMENTS, REPLACEMENT_BASE, TWITCH_EMOTE_BASE } from 'utilities/constants'; +import { TWITCH_POINTS_SETS, TWITCH_GLOBAL_SETS, TWITCH_PRIME_SETS, KNOWN_CODES, REPLACEMENTS, REPLACEMENT_BASE, TWITCH_EMOTE_BASE, KEYS } from 'utilities/constants'; import Twilight from 'site'; +import { FFZEvent } from 'src/utilities/events'; export default class Input extends Module { constructor(...args) { @@ -105,6 +106,12 @@ export default class Input extends Module { Twilight.CHAT_ROUTES ); + this.CommandSuggestions = this.fine.define( + 'tab-cmd-suggestions', + n => n && n.getMatches && n.doesCommandMatchTerm, + Twilight.CHAT_ROUTES + ); + // Implement Twitch's unfinished emote usage object for prioritizing sorting this.EmoteUsageCount = { TriHard: 196568036, @@ -220,10 +227,16 @@ export default class Input extends Module { this.overrideMentionMatcher(inst); }); + this.CommandSuggestions.ready((cls, instances) => { + for(const inst of instances) + this.overrideCommandMatcher(inst); + }); + this.ChatInput.on('update', this.updateEmoteCompletion, this); this.ChatInput.on('mount', this.overrideChatInput, this); this.EmoteSuggestions.on('mount', this.overrideEmoteMatcher, this); this.MentionSuggestions.on('mount', this.overrideMentionMatcher, this); + this.CommandSuggestions.on('mount', this.overrideCommandMatcher, this); this.on('chat.emotes:change-hidden', this.uncacheTabCompletion, this); this.on('chat.emotes:change-set-hidden', this.uncacheTabCompletion, this); @@ -311,6 +324,8 @@ export default class Input extends Module { inst.onKeyDown = function(event) { try { + const code = event.charCode || event.keyCode; + if ( inst.onEmotePickerToggle && t.chat.context.get('chat.emote-menu.shortcut') && event.key === 'e' && event.ctrlKey && ! event.altKey && ! event.shiftKey ) { inst.onEmotePickerToggle(); event.preventDefault(); @@ -318,8 +333,6 @@ export default class Input extends Module { } if ( inst.autocompleteInputRef && t.chat.context.get('chat.mru.enabled') && ! event.shiftKey && ! event.ctrlKey && ! event.altKey ) { - const code = event.charCode || event.keyCode; - // Arrow Up if ( code === 38 && inst.chatInputRef.selectionStart === 0 ) { if ( ! inst.messageHistory.length ) @@ -353,6 +366,14 @@ export default class Input extends Module { } } + // Let users close stuff with Escape. + if ( code === KEYS.Escape && ! event.shiftKey && ! event.ctrlKey && ! event.altKey ) { + if ( inst.props.isShowingEmotePicker ) + inst.props.closeEmotePicker(); + else if ( inst.props.tray && (! inst.state.value || ! inst.state.value.length) ) + inst.closeTray(); + } + } catch(err) { t.log.capture(err); t.log.error(err); @@ -383,10 +404,64 @@ export default class Input extends Module { overrideMentionMatcher(inst) { + inst.canBeTriggeredByTab = !this.chat.context.get('chat.tab-complete.emotes-without-colon'); + } + + + overrideCommandMatcher(inst) { if ( inst._ffz_override ) return; - inst.canBeTriggeredByTab = !this.chat.context.get('chat.tab-complete.emotes-without-colon'); + inst._ffz_override = true; + inst.oldCommands = inst.getCommands; + + const t = this; + + inst.getCommands = function(input) { try { + const commands = inst.props.getCommands(inst.props.permissionLevel, { + isEditor: inst.props.isCurrentUserEditor + }); + + const event = new FFZEvent({ + input, + permissionLevel: inst.props.permissionLevel, + isEditor: inst.props.isCurrentUserEditor, + commands + }); + + t.emit('chat:get-tab-commands', event); + + if ( ! commands || ! commands.length ) + return null; + + // Trim off the starting / + const i = input.slice(1); + + const sorted = commands.filter(cmd => inst.doesCommandMatchTerm(cmd, i)).sort(inst.sortCommands); + const out = []; + for(const cmd of sorted) { + const arg = cmd.commandArgs?.[0]; + let selection; + if ( arg?.isRequired ) + selection = `[${arg.name}]`; + + out.push({ + current: input, + replacement: inst.determineReplacement(cmd), + element: inst.renderCommandSuggestion(cmd, i), + group: cmd.ffz_group ? + (Array.isArray(cmd.ffz_group) ? t.i18n.t(...cmd.ffz_group) : cmd.ffz_group) + : inst.determineGroup(cmd), + selection + }); + } + + return out; + + } catch(err) { + console.error(err); + return inst.oldCommands(input); + }} } diff --git a/src/sites/twitch-twilight/modules/chat/line.js b/src/sites/twitch-twilight/modules/chat/line.js index c97ae887..883c6ce1 100644 --- a/src/sites/twitch-twilight/modules/chat/line.js +++ b/src/sites/twitch-twilight/modules/chat/line.js @@ -31,6 +31,7 @@ export default class ChatLine extends Module { this.inject('site.fine'); this.inject('site.web_munch'); this.inject(RichContent); + this.inject('experiments'); this.inject('chat.actions'); this.inject('chat.overrides'); @@ -83,6 +84,85 @@ export default class ChatLine extends Module { this.chat.context.on('changed:chat.filtering.highlight-basic-users-blocked--regex', this.updateLines, this); this.chat.context.on('changed:chat.filtering.highlight-basic-badges-blocked--list', this.updateLines, this); + this.on('chat:get-tab-commands', e => { + if ( this.experiments.getTwitchAssignmentByName('chat_replies') === 'control' ) + return; + + e.commands.push({ + name: 'reply', + description: 'Reply to a user\'s last message.', + permissionLevel: 0, + ffz_group: 'FrankerFaceZ', + commandArgs: [ + {name: 'username', isRequired: true}, + {name: 'message', isRequired: false} + ] + }) + }); + + this.on('chat:pre-send-message', e => { + if ( this.experiments.getTwitchAssignmentByName('chat_replies') === 'control' ) + return; + + const msg = e.message, + types = this.parent.chat_types || {}; + + let user, message; + if ( /^\/reply ?/i.test(msg) ) + user = msg.slice(7).trim(); + else + return; + + e.preventDefault(); + + const idx = user.indexOf(' '); + if ( idx !== -1 ) { + message = user.slice(idx + 1); + user = user.slice(0, idx); + } + + if ( user.startsWith('@') ) + user = user.slice(1); + + if ( user && user.length ) { + user = user.toLowerCase(); + + const lines = Array.from(this.ChatLine.instances); + let i = lines.length; + while(i--) { + const line = lines[i], + msg = line?.props?.message, + u = msg?.user; + + if ( ! u ) + continue; + + if ( u.login === user || u.displayName?.toLowerCase?.() === user ) { + if ( message ) { + e.sendMessage(message, { + reply: { + parentDeleted: msg.deleted || false, + parentDisplayName: u.displayName, + parentMessageBody: msg.message, + parentMsgId: msg.id, + parentUid: u.id, + parentUserLogin: u.login + } + }); + } else + requestAnimationFrame(() => line.ffzOpenReply()); + + return; + } + } + } + + e.addMessage({ + type: types.Notice, + message: this.i18n.t('chat.reply.bad-user', 'Invalid user or no known message to reply to.') + }); + }); + const t = this, React = await this.web_munch.findModule('react'); if ( ! React ) @@ -160,6 +240,78 @@ export default class ChatLine extends Module { props.showTimestamps !== this.props.showTimestamps; } + cls.prototype.ffzOpenReply = function() { + const old_render_author = this.renderMessageAuthor; + this.renderMessageAuthor = () => this.ffzReplyAuthor(); + + const tokens = this.props.message?.ffz_tokens; + if ( ! tokens ) + return; + + this.setMessageTray(this.props.message, t.chat.renderTokens(tokens, e)); + + this.renderMessageAuthor = old_render_author; + } + + cls.prototype.ffzReplyAuthor = function() { + const msg = t.chat.standardizeMessage(this.props.message), + user = msg.user, + raw_color = t.overrides.getColor(user.id) || user.color, + color = t.parent.colors.process(raw_color); + + let room = msg.roomLogin ? msg.roomLogin : msg.channel ? msg.channel.slice(1) : undefined, + room_id = msg.roomId ? msg.roomId : this.props.channelID; + + if ( ! room && room_id ) { + const r = t.chat.getRoom(room_id, null, true); + if ( r && r.login ) + room = msg.roomLogin = r.login; + } + + if ( ! room_id && room ) { + const r = t.chat.getRoom(null, room_id, true); + if ( r && r.id ) + room_id = msg.roomId = r.id; + } + + const user_block = [ + e('span', { + className: 'chat-author__display-name' + }, user.displayName), + user.isIntl && e('span', { + className: 'chat-author__intl-login' + }, ` (${user.login})`) + ]; + + const override_name = t.overrides.getName(user.id); + + return e('span', { + 'data-room-id': room_id, + 'data-room': room, + 'data-user-id': user.userID, + 'data-user': user.userLogin && user.userLogin.toLowerCase() + }, [ + //t.actions.renderInline(msg, this.props.showModerationIcons, u, r, e), + e('span', { + className: 'chat-line__message--badges' + }, t.chat.badges.render(msg, e)), + e('span', { + className: `chat-line__username notranslate${override_name ? ' ffz--name-override tw-relative tw-tooltip-wrapper' : ''}`, + role: 'button', + style: { color }, + onClick: this.ffz_user_click_handler, + onContextMenu: t.actions.handleUserContext + }, override_name ? [ + e('span', { + className: 'chat-author__display-name' + }, override_name), + e('div', { + className: 'tw-tooltip tw-tooltip--down tw-tooltip--align-center' + }, user_block) + ] : user_block) + ]); + } + cls.prototype.render = function() { try { this._ffz_no_scan = true; @@ -168,6 +320,7 @@ export default class ChatLine extends Module { override_mode = t.chat.context.get('chat.filtering.display-deleted'), msg = t.chat.standardizeMessage(this.props.message), + reply_tokens = msg.ffz_reply = msg.ffz_reply || t.chat.tokenizeReply(this.props.reply), is_action = msg.messageType === types.Action, user = msg.user, @@ -258,12 +411,15 @@ other {# messages were deleted by a moderator.} //if ( ! msg.message && msg.messageParts ) // t.chat.detokenizeMessage(msg); + const has_replies = this.chatRepliesTreatment ? this.chatRepliesTreatment !== 'control' : false; + const u = t.site.getUser(), r = {id: room_id, login: room}; if ( u ) { u.moderator = this.props.isCurrentUserModerator; u.staff = this.props.isCurrentUserStaff; + u.can_reply = has_replies && u.login !== msg.user?.login && ! msg.deleted && ! this.props.disableReplyClick } const tokens = msg.ffz_tokens = msg.ffz_tokens || t.chat.tokenizeMessage(msg, u, r), @@ -317,7 +473,6 @@ other {# messages were deleted by a moderator.} const override_name = t.overrides.getName(user.id); - let cls = `chat-line__message${show_class ? ' ffz--deleted-message' : ''}`, out = (tokens.length || ! msg.ffz_type) ? [ this.props.showTimestamps && e('span', { @@ -342,11 +497,14 @@ other {# messages were deleted by a moderator.} }, user_block) ] : user_block), e('span', null, is_action ? ' ' : ': '), + show && has_replies && reply_tokens ? + t.chat.renderTokens(reply_tokens, e) + : null, show ? e('span', { className:'message', style: is_action ? { color } : null - }, t.chat.renderTokens(tokens, e)) + }, t.chat.renderTokens(tokens, e, has_replies ? this.props.reply : null)) : e('span', { className: 'chat-line__message--deleted', diff --git a/src/sites/twitch-twilight/modules/theme/index.js b/src/sites/twitch-twilight/modules/theme/index.js index d41b02d7..52f97e4d 100644 --- a/src/sites/twitch-twilight/modules/theme/index.js +++ b/src/sites/twitch-twilight/modules/theme/index.js @@ -21,7 +21,7 @@ const COLORS = [ const ACCENT_COLORS = { - dark: {'c':{'accent': 9,'background-accent':8,'background-accent-alt':7,'background-accent-alt-2':6,'background-button':7,'background-button-active':7,'background-button-focus':8,'background-button-hover':8,'background-button-primary-active':7,'background-button-primary-default':9,'background-button-primary-hover':8,'background-graph':2,'background-graph-fill':8,'background-input-checkbox-checked':9,'background-input-checked':8,'background-interactable-active':9,'background-interactable-hover':8,'background-progress-countdown-status':9,'background-progress-status':9,'background-range-fill':9,'background-subscriber-stream-tag-active':4,'background-subscriber-stream-tag-default':4,'background-subscriber-stream-tag-hover':3,'background-toggle-checked':9,/*'background-tooltip':1,*/'background-top-nav':6,'border-brand':9,'border-button':7,'border-button-active':8,'border-button-focus':9,'border-button-hover':8,'border-input-checkbox-checked':9,'border-input-checkbox-focus':9,'border-input-focus':9,'border-interactable-selected':10,'border-subscriber-stream-tag':5,'border-tab-active':11,'border-tab-focus':11,'border-tab-hover':11,'border-toggle-focus':7,'border-toggle-hover':7,'border-whisper-incoming':10,'fill-brand':9,'text-button-text':8,'text-button-text-focus':'o1','text-button-text-hover':'o1','text-link':10,'text-link-active':10,'text-link-focus':10,'text-link-hover':10,'text-link-visited':10,'text-overlay-link-active':13,'text-overlay-link-focus':13,'text-overlay-link-hover':13,'text-tab-active':11,'background-chat':1,'background-chat-alt':3,'background-chat-header':2,'background-modal':3,'text-button-text-active':'o2'/*,'text-tooltip':1*/},'s':{'button-active':[8,'0 0 6px 0',''],'button-focus':[8,'0 0 6px 0',''],'input-focus':[8,'0 0 10px -2px',''],'interactable-focus':[8,'0 0 6px 0',''],'tab-focus':[11,'0 4px 6px -4px',''],'input':[5,'inset 0 0 0 1px','']}}, + dark: {'c':{'accent': 9,'background-accent':8,'background-accent-alt':7,'background-accent-alt-2':6,'background-button':7,'background-button-active':7,'background-button-focus':8,'background-button-hover':8,'background-button-primary-active':7,'background-button-primary-default':9,'background-button-primary-hover':8,'background-graph':2,'background-graph-fill':8,'background-input-checkbox-checked':9,'background-input-checked':8,'background-interactable-active':9,'background-interactable-hover':8,'background-progress-countdown-status':9,'background-progress-status':9,'background-range-fill':9,'background-subscriber-stream-tag-active':4,'background-subscriber-stream-tag-default':4,'background-subscriber-stream-tag-hover':3,'background-toggle-checked':9,/*'background-tooltip':1,*/'background-top-nav':6,'border-brand':9,'border-button':7,'border-button-active':8,'border-button-focus':9,'border-button-hover':8,'border-input-checkbox-checked':9,'border-input-checkbox-focus':9,'border-input-focus':9,'border-interactable-selected':10,'border-subscriber-stream-tag':5,'border-tab-active':11,'border-tab-focus':11,'border-tab-hover':11,'border-toggle-focus':7,'border-toggle-hover':7,'border-whisper-incoming':10,'fill-brand':9,'text-button-text':10,'text-button-text-focus':'o1','text-button-text-hover':'o1','text-link':10,'text-link-active':10,'text-link-focus':10,'text-link-hover':10,'text-link-visited':10,'text-overlay-link-active':13,'text-overlay-link-focus':13,'text-overlay-link-hover':13,'text-tab-active':11,'background-chat':1,'background-chat-alt':3,'background-chat-header':2,'background-modal':3,'text-button-text-active':'o2'/*,'text-tooltip':1*/},'s':{'button-active':[8,'0 0 6px 0',''],'button-focus':[8,'0 0 6px 0',''],'input-focus':[8,'0 0 10px -2px',''],'interactable-focus':[8,'0 0 6px 0',''],'tab-focus':[11,'0 4px 6px -4px',''],'input':[5,'inset 0 0 0 1px','']}}, light: {'c':{'accent': 9,'background-accent':8,'background-accent-alt':7,'background-accent-alt-2':6,'background-button':7,'background-button-active':7,'background-button-focus':8,'background-button-hover':8,'background-button-primary-active':7,'background-button-primary-default':9,'background-button-primary-hover':8,'background-graph':15,'background-graph-fill':9,'background-input-checkbox-checked':9,'background-input-checked':8,'background-interactable-active':9,'background-interactable-hover':8,'background-progress-countdown-status':8,'background-progress-status':8,'background-range-fill':9,'background-subscriber-stream-tag-active':13,'background-subscriber-stream-tag-default':13,'background-subscriber-stream-tag-hover':14,'background-toggle-checked':9,/*'background-tooltip':1,*/'background-top-nav':7,'border-brand':9,'border-button':7,'border-button-active':8,'border-button-focus':9,'border-button-hover':8,'border-input-checkbox-checked':9,'border-input-checkbox-focus':9,'border-input-focus':9,'border-interactable-selected':9,'border-subscriber-stream-tag':10,'border-tab-active':8,'border-tab-focus':8,'border-tab-hover':8,'border-toggle-focus':8,'border-toggle-hover':8,'border-whisper-incoming':10,'fill-brand':9,'text-button-text':8,'text-button-text-focus':'o1','text-button-text-hover':'o1','text-link':8,'text-link-active':9,'text-link-focus':9,'text-link-hover':9,'text-link-visited':9,'text-overlay-link-active':13,'text-overlay-link-focus':13,'text-overlay-link-hover':13,'text-tab-active':8},'s':{'button-active':[8,'0 0 6px 0',''],'button-focus':[8,'0 0 6px 0',''],'input-focus':[10,'0 0 10px -2px',''],'interactable-focus':[8,'0 0 6px 1px',''],'tab-focus':[8,'0 4px 6px -4px','']}}, accent_dark: {'c':{'accent-hover':10,'accent':9,'accent-primary-1':1,'accent-primary-2':5,'accent-primary-3':6,'accent-primary-4':7,'accent-primary-5':8},'s':{}}, accent_light: {'c':{'accent-hover':10,'accent':9,'accent-primary-1':1,'accent-primary-2':5,'accent-primary-3':6,'accent-primary-4':7,'accent-primary-5':8},'s':{}} diff --git a/src/sites/twitch-twilight/styles/chat.scss b/src/sites/twitch-twilight/styles/chat.scss index 277dd867..3e9094dd 100644 --- a/src/sites/twitch-twilight/styles/chat.scss +++ b/src/sites/twitch-twilight/styles/chat.scss @@ -55,6 +55,27 @@ pointer-events: none; } +.ffz--reply-mention { + padding: 0.25rem 0.5rem; + border-radius: 1rem; + + &:before { + font-size: 0.8em; + } + + background-color: rgba(0,0,0,0.15); + + .tw-root--theme-dark & { + background-color: rgba(255,255,255,0.15); + } + + &:hover, &:focus { + text-decoration: none; + background-color: var(--color-background-button-hover); + color: var(--color-text-button-hover) !important; + } +} + .ffz--chat-card { .vod-message & { .ffz--card-text { diff --git a/src/socket.js b/src/socket.js index ca80882a..41ccc776 100644 --- a/src/socket.js +++ b/src/socket.js @@ -72,7 +72,6 @@ export default class SocketClient extends Module { this._host_idx = -1; this._host_pool = -1; - this.settings.on(':changed:socket.use-cluster', () => { this._host = null; if ( this.disconnected ) diff --git a/src/std-components/aspect.vue b/src/std-components/aspect.vue index 03fa9227..9a3e0c17 100644 --- a/src/std-components/aspect.vue +++ b/src/std-components/aspect.vue @@ -1,11 +1,11 @@