diff --git a/package.json b/package.json index 62609e2f..fd2c50b1 100755 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "frankerfacez", "author": "Dan Salvato LLC", - "version": "4.46.2", + "version": "4.47.0", "description": "FrankerFaceZ is a Twitch enhancement suite.", "private": true, "license": "Apache-2.0", diff --git a/src/modules/chat/badges.jsx b/src/modules/chat/badges.jsx index ddd530fb..cbf8c27f 100644 --- a/src/modules/chat/badges.jsx +++ b/src/modules/chat/badges.jsx @@ -185,6 +185,7 @@ export default class Badges extends Module { this.inject('tooltips'); this.inject('experiments'); this.inject('staging'); + this.inject('load_tracker'); this.style = new ManagedStyle('badges'); @@ -424,6 +425,11 @@ export default class Badges extends Module { this.rebuildAllCSS(); this.loadGlobalBadges(); + this.on('chat:reload-data', flags => { + if ( ! flags || flags.badges ) + this.loadGlobalBadges(); + }); + this.tooltips.types.badge = (target, tip) => { tip.add_class = 'ffz__tooltip--badges'; @@ -951,6 +957,8 @@ export default class Badges extends Module { async loadGlobalBadges(tries = 0) { + this.load_tracker.schedule('chat-data', 'ffz-global-badges'); + let response, data; if ( this.experiments.getAssignment('api_load') && tries < 1 ) @@ -966,16 +974,20 @@ export default class Badges extends Module { return setTimeout(() => this.loadGlobalBadges(tries), 500 * tries); this.log.error('Error loading global badge data.', err); + this.load_tracker.notify('chat-data', 'ffz-global-badges', false); return false; } - if ( ! response.ok ) + if ( ! response.ok ) { + this.load_tracker.notify('chat-data', 'ffz-global-badges', false); return false; + } try { data = await response.json(); } catch(err) { this.log.error('Error parsing global badge data.', err); + this.load_tracker.notify('chat-data', 'ffz-global-badges', false); return false; } @@ -1017,6 +1029,7 @@ export default class Badges extends Module { this.log.info(`Loaded ${badges} badges and assigned them to ${users} users.`); this.buildBadgeCSS(); + this.load_tracker.notify('chat-data', 'ffz-global-badges'); } diff --git a/src/modules/chat/emotes.js b/src/modules/chat/emotes.js index 7bbf3fb6..b62a12b3 100644 --- a/src/modules/chat/emotes.js +++ b/src/modules/chat/emotes.js @@ -639,6 +639,11 @@ export default class Emotes extends Module { this.on('socket:command:follow_sets', this.updateFollowSets, this); + this.on('chat:reload-data', flags => { + if ( ! flags || flags.emotes ) + this.loadGlobalSets(); + }); + this.loadGlobalSets(); } @@ -1419,6 +1424,14 @@ export default class Emotes extends Module { } removeDefaultSet(provider, set_id) { + if ( ! set_id ) { + const sets = this.default_sets.get(provider); + if ( sets ) + for(const set_id of Array.from(sets)) + this.removeDefaultSet(provider, set_id); + return; + } + if ( typeof set_id === 'number' ) set_id = `${set_id}`; @@ -1530,6 +1543,9 @@ export default class Emotes extends Module { const sets = data.sets || {}; + // Remove existing global sets, in case we have any. + this.removeDefaultSet('ffz-global'); + for(const set_id of data.default_sets) this.addDefaultSet('ffz-global', set_id); diff --git a/src/modules/chat/index.js b/src/modules/chat/index.js index bcd701e4..5b5dc397 100644 --- a/src/modules/chat/index.js +++ b/src/modules/chat/index.js @@ -1263,6 +1263,44 @@ export default class Chat extends Module { for(const key in LINK_PROVIDERS) if ( has(LINK_PROVIDERS, key) ) this.addLinkProvider(LINK_PROVIDERS[key]); + + this.on('chat:reload-data', flags => { + for(const room of this.iterateRooms()) + room.load_data(); + }); + + this.on('chat:get-tab-commands', event => { + event.commands.push({ + name: 'ffz reload', + description: this.i18n.t('chat.command.reload', 'Reload FFZ and add-on chat data (emotes, badges, etc.)'), + permissionLevel: 0, + ffz_group: 'FrankerFaceZ' + }); + }); + + this.triggered_reload = false; + + this.on('chat:ffz-command:reload', event => { + if ( this.triggered_reload ) + return; + + const sc = this.resolve('site.chat'); + if ( sc?.addNotice ) + sc.addNotice('*', this.i18n.t('chat.command.reload.starting', 'FFZ is reloading data...')); + + this.triggered_reload = true; + this.emit('chat:reload-data'); + }); + + this.on('load_tracker:complete:chat-data', () => { + if ( this.triggered_reload ) { + const sc = this.resolve('site.chat'); + if ( sc?.addNotice ) + sc.addNotice('*', this.i18n.t('chat.command.reload.done', 'FFZ has finished reloading data.')); + } + + this.triggered_reload = false; + }); } diff --git a/src/modules/chat/room.js b/src/modules/chat/room.js index 3583a29f..b286e417 100644 --- a/src/modules/chat/room.js +++ b/src/modules/chat/room.js @@ -314,10 +314,10 @@ export default class Room { this.data = d; + this.removeAllSets('main'); + if ( d.set ) this.addSet('main', d.set); - else - this.removeAllSets('main'); if ( data.sets ) for(const set_id in data.sets) diff --git a/src/settings/components/monitor.vue b/src/settings/components/monitor.vue index 71622a82..090aacee 100644 --- a/src/settings/components/monitor.vue +++ b/src/settings/components/monitor.vue @@ -7,21 +7,26 @@