diff --git a/package.json b/package.json index f2ca2fc1..232f560d 100755 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "frankerfacez", "author": "Dan Salvato LLC", - "version": "4.8.2", + "version": "4.9.0", "description": "FrankerFaceZ is a Twitch enhancement suite.", "license": "Apache-2.0", "scripts": { diff --git a/src/modules/chat/actions/index.jsx b/src/modules/chat/actions/index.jsx index 23b74c93..155fb300 100644 --- a/src/modules/chat/actions/index.jsx +++ b/src/modules/chat/actions/index.jsx @@ -133,7 +133,7 @@ export default class Actions extends Module { ui: { path: 'Chat > Actions > Room @{"description": "Here, you can define custom actions that will appear above the chat input box."}', component: 'chat-actions', - context: ['room'], + context: ['room', 'room-mode'], inline: true, data: () => { @@ -436,7 +436,10 @@ export default class Actions extends Module { if ( ! def || disp.disabled || (disp.mod_icons != null && disp.mod_icons !== !!mod_icons) || (disp.mod != null && disp.mod !== (current_user ? !!current_user.mod : false)) || - (disp.staff != null && disp.staff !== (current_user ? !!current_user.staff : false)) ) + (disp.staff != null && disp.staff !== (current_user ? !!current_user.staff : false)) || + (disp.emoteOnly != null && disp.emoteOnly !== current_room.emoteOnly) || + (disp.slowMode != null && disp.slowMode !== current_room.slowMode) || + (disp.subsMode != null && disp.subsMode !== current_room.subsMode) ) continue; const has_color = def.colored && ap.color, diff --git a/src/modules/chat/emote_info.gql b/src/modules/chat/emote_info.gql index c3788d5d..d7877d1e 100644 --- a/src/modules/chat/emote_info.gql +++ b/src/modules/chat/emote_info.gql @@ -5,8 +5,6 @@ query FFZ_GetEmoteInfo($id: ID!) { text subscriptionProduct { id - displayName - state owner { id login @@ -14,12 +12,6 @@ query FFZ_GetEmoteInfo($id: ID!) { } tier url - self { - benefit { - id - endsAt - } - } } } } \ No newline at end of file diff --git a/src/modules/chat/emotes.js b/src/modules/chat/emotes.js index cfc6e554..1b1c8ce7 100644 --- a/src/modules/chat/emotes.js +++ b/src/modules/chat/emotes.js @@ -798,6 +798,41 @@ export default class Emotes extends Module { return tes.get(emote_id); tes.set(emote_id, null); + + /*const apollo = this.resolve('site.apollo'); + if ( apollo?.client ) { + timeout(apollo.client.query({ + query: GET_EMOTE, + variables: { + id: `${emote_id}` + } + }), 1000).then(result => { + const emote = result?.data?.emote; + + if ( ! emote ) { + tes.delete(emote_id); + return; + } + + const set_id = parseInt(emote.setID, 10), + channel = emote?.subscriptionProduct?.owner; + + this.__twitch_set_to_channel.set(set_id, { + s_id: set_id, + c_id: channel ? channel.id : null, + c_name: channel ? channel.login : null, + c_title: channel ? channel.displayName : null + }); + + tes.set(emote_id, set_id); + if ( callback ) + callback(set_id); + + }).catch(() => tes.delete(emote_id)); + + return; + }*/ + timeout(this.socket.call('get_emote', emote_id), 1000).then(data => { const set_id = data['s_id']; tes.set(emote_id, set_id); @@ -827,6 +862,7 @@ export default class Emotes extends Module { return null; tes.set(set_id, null); + try { const data = await timeout(this.socket.call('get_emote_set', set_id), 1000); tes.set(set_id, data); diff --git a/src/modules/chat/tokenizers.jsx b/src/modules/chat/tokenizers.jsx index e04fd975..adeffdec 100644 --- a/src/modules/chat/tokenizers.jsx +++ b/src/modules/chat/tokenizers.jsx @@ -1028,7 +1028,7 @@ export const AddonEmotes = { const set_id = this.emotes.getTwitchEmoteSet(emote_id, tip.rerender), emote_set = set_id != null && this.emotes.getTwitchSetChannel(set_id, tip.rerender); - preview = `//static-cdn.jtvnw.net/emoticons/v1/${emote_id}/4.0?_=preview`; + preview = `//static-cdn.jtvnw.net/emoticons/v1/${emote_id}/3.0?_=preview`; fav_source = 'twitch'; if ( emote_set ) { diff --git a/src/modules/main_menu/components/action-editor.vue b/src/modules/main_menu/components/action-editor.vue index aec90b20..ee4dbef9 100644 --- a/src/modules/main_menu/components/action-editor.vue +++ b/src/modules/main_menu/components/action-editor.vue @@ -140,6 +140,72 @@ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+
+
+ + + +
+ +
+ + + +
+ +
+ + + +
+
Metadata >> Player', title: 'Stream Delay Warning', - description: 'Define a maximum delay in seconds after which the indicator will be shown in warning colors. (0 for no warning colors)', + description: 'When the current stream delay exceeds this number of seconds, display the stream delay in a warning color to draw attention to the large delay. Set to zero to disable.', component: 'setting-text-box', process(val) { diff --git a/src/sites/twitch-twilight/modules/chat/input.jsx b/src/sites/twitch-twilight/modules/chat/input.jsx index 61ca131d..073bc648 100644 --- a/src/sites/twitch-twilight/modules/chat/input.jsx +++ b/src/sites/twitch-twilight/modules/chat/input.jsx @@ -171,12 +171,24 @@ export default class Input extends Module { r = { id: props.channelID, login: props.channelLogin, - displayName: props.channelDisplayName + displayName: props.channelDisplayName, + emoteOnly: props.emoteOnlyMode, + slowMode: props.slowMode, + slowDuration: props.slowModeDuration, + subsMode: props.subsOnlyMode } const actions = t.actions.renderRoom(t.chat.context.get('context.chat.showModIcons'), u, r, createElement); + + // TODO: Instead of putting actions above the chat input, + // put them next to the settings menu. This involves going + // exploring in the React render output, which is a mess. + //t.log.info('chat-input-render', out); + if ( actions ) out.props.children.unshift(actions); + else + out.props.children.unshift(null); } catch(err) { t.log.error(err); @@ -527,22 +539,24 @@ export default class Input extends Module { channel_login ); - for(const set of sets) - for(const emote of Object.values(set.emotes)) - if ( inst.doesEmoteMatchTerm(emote, search) ) { - const favorite = this.emotes.isFavorite(set.source || 'ffz', emote.id); - results.push({ - current: input, - replacement: emote.name, - element: inst.renderEmoteSuggestion({ - token: emote.name, - id: `${set.source}-${emote.id}`, - srcSet: emote.srcSet, + for(const set of sets) { + if ( set && set.emotes ) + for(const emote of Object.values(set.emotes)) + if ( inst.doesEmoteMatchTerm(emote, search) ) { + const favorite = this.emotes.isFavorite(set.source || 'ffz', emote.id); + results.push({ + current: input, + replacement: emote.name, + element: inst.renderEmoteSuggestion({ + token: emote.name, + id: `${set.source}-${emote.id}`, + srcSet: emote.srcSet, + favorite + }), favorite - }), - favorite - }); - } + }); + } + } return results; } diff --git a/src/sites/twitch-twilight/modules/css_tweaks/index.js b/src/sites/twitch-twilight/modules/css_tweaks/index.js index 5e5fd490..fd2accb5 100644 --- a/src/sites/twitch-twilight/modules/css_tweaks/index.js +++ b/src/sites/twitch-twilight/modules/css_tweaks/index.js @@ -24,7 +24,7 @@ const CLASSES = { 'player-ext-hover': '.player:not([data-controls="true"]) .extension-container,.player:not([data-controls="true"]) .extensions-dock__layout,.player:not([data-controls="true"]) .extensions-notifications,.player:not([data-controls="true"]) .extensions-video-overlay-size-container', 'player-event-bar': '.channel-root .live-event-banner-ui__header', - 'player-rerun-bar': '.channel-root__player_container div.tw-c-text-overlay:not([data-a-target="hosting-ui-header"])', + 'player-rerun-bar': '.channel-root__player-container div.tw-c-text-overlay:not([data-a-target="hosting-ui-header"])', 'pinned-cheer': '.pinned-cheer,.pinned-cheer-v2', 'whispers': 'body .whispers',