您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Blocks messages from specific users on Collaborate chat panels
当前为
// ==UserScript== // @name Chat User Blocker for Collaborate // @namespace http://tampermonkey.net/ // @version 1.3.1 // @description Blocks messages from specific users on Collaborate chat panels // @author Lejafurigon // @match https://au.bbcollab.com/* // @grant none // @license MIT // @run-at document-end // ==/UserScript== (function() { 'use strict'; // List of usernames to block const BLOCKED_USERS = [ "INSERT USER HERE", ]; // Key for storing blocked message IDs in storage const STORAGE_KEY = 'bb_chat_blocker_removed_ids'; // Clear any existing stored IDs to prevent incorrect filtering // If the script is misbehaving, this ensures a clean start localStorage.removeItem(STORAGE_KEY); // Process an individual message function processMessage(item) { let nameElement = item.querySelector('.participant-name'); if (!nameElement) return; const username = nameElement.textContent.trim(); // ONLY remove messages from users in the BLOCKED_USERS list // No stored IDs to avoid false positives if (BLOCKED_USERS.includes(username)) { item.remove(); console.log(`Blocked message from: ${username}`); } } // Process all messages in the container function processAllMessages() { document.querySelectorAll('.chat-history__activity-item').forEach(item => { processMessage(item); }); } // Set up the mutation observer to watch for new messages and DOM changes function setupObserver() { // Watch for changes to the chat history list const chatHistoryContainer = document.getElementById('chat-channel-history'); if (chatHistoryContainer) { const observer = new MutationObserver((mutations) => { // Check each added node to see if it's a message that should be blocked mutations.forEach(mutation => { if (mutation.type === 'childList' && mutation.addedNodes.length > 0) { mutation.addedNodes.forEach(node => { // Only process element nodes that are message items if (node.nodeType === 1 && node.classList && node.classList.contains('chat-history__activity-item')) { processMessage(node); } }); } }); }); observer.observe(chatHistoryContainer, { childList: true, subtree: true }); console.log("MutationObserver started for chat history"); } // Also watch for the entire panel being added/removed const contentObserver = new MutationObserver((mutations) => { mutations.forEach(mutation => { if (mutation.type === 'childList') { // If panel section is added to DOM if (document.querySelector('.panel-content') && document.getElementById('chat-channel-history')) { console.log("Chat panel detected - processing messages"); processAllMessages(); } } }); }); // Observe the body for changes, to catch when the panel is added/removed contentObserver.observe(document.body, { childList: true, subtree: true }); console.log("Content observer started for panel changes"); } // Initialize the blocker functionality function initializeBlocker() { // Initial processing of existing messages if (document.getElementById('chat-channel-history')) { processAllMessages(); setupObserver(); console.log("Chat blocker initialized"); } else { // If chat container isn't found yet, wait and retry setTimeout(initializeBlocker, 1000); console.log("Waiting for chat panel to load..."); } // Set up event listeners for page visibility/focus changes document.addEventListener('visibilitychange', () => { if (!document.hidden && document.getElementById('chat-channel-history')) { console.log("Page visibility changed, reprocessing messages"); processAllMessages(); } }); window.addEventListener('focus', () => { if (document.getElementById('chat-channel-history')) { console.log("Window focus event, reprocessing messages"); processAllMessages(); } }); } // Create a persistent checker that runs periodically function setupPeriodicChecker() { setInterval(() => { if (document.getElementById('chat-channel-history')) { processAllMessages(); } }, 3000); } // Start the process initializeBlocker(); setupPeriodicChecker(); // Add a special event handler for Angular-based applications window.addEventListener('hashchange', () => { setTimeout(() => { if (document.getElementById('chat-channel-history')) { console.log("Hash change detected, reprocessing messages"); processAllMessages(); } }, 1000); }); })();