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',