1
0
Fork 0
mirror of https://github.com/FrankerFaceZ/FrankerFaceZ.git synced 2025-06-27 21:05:53 +00:00
FrankerFaceZ/src/entry_ext.js
SirStendec 1d046fca2b 4.76.0
* Added: Setting to control the priority of third-party emote providers. This lets you, as an example, prioritize emotes from 7TV over BetterTTV. Note that these priorities are still secondary to emote source priorities (personal emotes > channel emotes > global emotes). (Closes #1587)
* Added: Setting to replace the native player 'Clip' button with a custom button that better fits the style of the other buttons. (Closes #1580)
* Fixed: Highlighting messages from users with open viewer cards not working correctly with alternating background colors enabled. (Closes #1581)
* Fixed: Various directory features not working correctly. (Closes #1588)
* Fixed: Emotes unlocked with channel points appearing on FFZ emote cards with the source 'CHANNEL_POINTS'.
* Fixed: The Experiments UI failing to load correctly if an experiment has no name.
* Experiments: Preparing for a new PubSub experiment.
* API Added: `emotes.setProvider(provider: string, data: {name: string, icon: string, description: string})` for registering an emote provider. This is used by the new setting to let users customize emote provider priorities.
* API Added: All modules now have a `addon_manifest` property which will contain the add-on's manifest if the module belongs to an add-on.
2024-12-03 16:15:11 -05:00

118 lines
2.7 KiB
JavaScript

/* eslint strict: off */
'use strict';
(() => {
const browser = globalThis.browser ?? globalThis.chrome;
if (
// Don't run on certain sub-domains.
/^(?:localhost\.rig|blog|im|chatdepot|tmi|api|brand|dev|gql|passport)\./.test(location.hostname)
||
// Don't run on pages that have disabled FFZ.
/disable_frankerfacez/.test(location.search)
||
// Don't run on pages we've already run on.
document.body.dataset.ffzSource
) {
// Tell the service worker we aren't injecting.
browser.runtime.sendMessage({
type: 'ffz_not_supported'
});
return;
}
document.body.dataset.ffzSource = 'extension';
// Make sure to wake the service worker up early.
browser.runtime.sendMessage({
type: 'ffz_injecting'
});
// Set up a bridge for connections, since Firefox
// doesn't support externally_connectable.
const connections = new Map;
function handleConnect(id) {
if ( connections.has(id) )
return;
const port = browser.runtime.connect();
connections.set(id, port);
port.onMessage.addListener(msg => {
window.postMessage({
type: 'ffz-con-message',
id,
payload: msg
})
});
port.onDisconnect.addListener(() => {
connections.delete(id);
window.postMessage({
type: 'ffz-con-disconnect',
id
});
});
}
function handleDisconnect(id) {
const port = connections.get(id);
if ( port ) {
connections.delete(id);
port.disconnect();
}
}
function handleMessage(id, payload) {
const port = connection.get(id);
if ( port ) {
port.postMessage(payload);
}
}
window.addEventListener('message', evt => {
if (evt.source !== window || ! evt.data )
return;
const { type, id, payload } = evt.data;
if ( type === 'ffz-con-connect' )
handleConnect(id);
else if ( type === 'ffz-con-message' )
handleMessage(id, payload);
else if ( type === 'ffz-con-disconnect' )
handleDisconnect(id);
});
// Let the extension send messages to the page directly.
browser.runtime.onMessage.addListener((msg, sender) => {
if (msg?.type === 'ffz_to_page')
window.postMessage(msg.data, '*');
return false;
});
// Now, inject our script into the page context.
const HOST = location.hostname,
SERVER = browser.runtime.getURL("web"),
script = document.createElement('script');
let FLAVOR =
HOST.includes('player') ? 'player' :
HOST.includes('clips') ? 'clips' :
(location.pathname === '/p/ffz_bridge/' ? 'bridge' : 'avalon');
if (FLAVOR === 'clips' && location.pathname === '/embed')
FLAVOR = 'player';
script.id = 'ffz-script';
script.async = true;
script.crossOrigin = 'anonymous';
script.src = `${SERVER}/${FLAVOR}.js?_=${Date.now()}`;
script.dataset.path = SERVER;
document.head.appendChild(script);
})();