您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
This script is intended to work with @require only. Provides class AutomatedElementTextNotifier
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.greatest.deepsurf.us/scripts/438801/1019653/UserScript%20Automated%20Element%20Text%20Notifier.js
// ==UserScript== // @namespace Xortrox/UserScripts/AutomatedElementTextNotifier // @name UserScript Automated Element Text Notifier // @version 0.7 // @description This script is intended to work with @require only. Provides class AutomatedElementTextNotifier // @author Xortrox, // @match * // @esversion: 6 // @license MIT // ==/UserScript== class AutomatedElementTextNotifier { constructor(options) { this.icon = options.icon || ''; this.title = options.title || 'No Title Specified'; this.selector = options.selector; /** How frequently to scan for changes on the website (in milliseconds) */ this.notificationInterval = options.interval; /** * Every includes/excludes does a check for selector matched element's "innerText" value * Each entry will be checked in priority from top to bottom and only the first match will send its notification * All configs must have an includes entry, while exclusion is optional. * */ this.scanConfiguration = options.config; if (!this.selector) { this.error('Error: No selector specified for AutomatedElementTextNotifier'); } } async init() { await window.UserScript.Notifications.askPermission(); this.interval = setInterval(this.scan, this.notificationInterval); } scan = () => { const notificationElements = document.querySelectorAll(this.selector); /** We send notification only once if any adventures are claimable */ if (notificationElements && notificationElements.length > 0) { let notified = false; for (let element of notificationElements) { if (notified) { break; } const text = element.innerText; const textLower = text.toLowerCase(); for (const config of this.scanConfiguration) { let includesText = false; let excludesText = false; for (const includeText of config.includes) { if (textLower.includes(includeText)) { includesText = true; break; } } if (config.excludes?.length > 0) { for (const excludeText of config.excludes) { if (!textLower.includes(excludeText)) { excludesText = true; break; } } } let canShowNotification = includesText; if (config.excludes?.length > 0) { canShowNotification = canShowNotification && excludesText; } if (canShowNotification) { window.UserScript.Notifications.notify(this.title, config.notificationText, this.icon); notified = true; break; } } } } } error(error) { alert(error); console.error(new Error(error)); } }