Greasy Fork is available in English.
Play a sound when a goal goes in for currently favourited matches or competitions
当前为
// ==UserScript==
// @name Bet365 Goal Alert Sound (Favourites only)
// @namespace http://tampermonkey.net/
// @version 0.3
// @description Play a sound when a goal goes in for currently favourited matches or competitions
// @match https://www.bet365.com/*
// @license MIT
// ==/UserScript==
(function () {
'use strict';
// Short alert sound
const audio = new Audio("https://actions.google.com/sounds/v1/cartoon/wood_plank_flicks.ogg");
// Check if a fixture or its parent competition is currently favourited
function isCurrentlyFavourited(fixture) {
if (!fixture) return false;
if (
fixture.classList.contains("ovm-FavouritesContainer_Favourite") ||
fixture.classList.contains("ovm-Fixture-favourite")
) return true;
const competition = fixture.closest(".ovm-Competition");
if (
competition?.classList.contains("ovm-FavouritesContainer_Favourite") ||
competition?.classList.contains("ovm-Competition-favourite")
) return true;
return false;
}
// Handler when a goal alert node is added
function handleGoal(node) {
const fixture = node.closest(".ovm-Fixture");
if (!isCurrentlyFavourited(fixture)) return;
const teamNames = [...fixture.querySelectorAll(".ovm-FixtureDetailsTwoWay_TeamName")]
.map(el => el.textContent.trim());
console.log("GOAL in currently favourited match:", teamNames);
audio.play().catch(err => console.warn("Audio play failed:", err));
}
// Mutation observer for goal alerts
const observer = new MutationObserver(mutations => {
for (const mutation of mutations) {
for (const node of mutation.addedNodes) {
if (!(node instanceof HTMLElement)) continue;
if (node.classList.contains("ovm-GoalEventAlert")) {
handleGoal(node);
}
}
}
});
observer.observe(document.body, {
childList: true,
subtree: true
});
})();