Reddit Chat Anonymizer

A privacy-focused userscript that locally modifies Reddit chat to enhance anonymity by removing usernames and avatars

目前为 2024-12-19 提交的版本。查看 最新版本

// ==UserScript==
// @name        Reddit Chat Anonymizer
// @namespace   Violentmonkey Scripts
// @match       https://chat.reddit.com/room*
// @grant       none
// @version     1.0.1
// @author      AveTrue
// @license GNU General Public License v3.0 
// @description A privacy-focused userscript that locally modifies Reddit chat to enhance anonymity by removing usernames and avatars
// ==/UserScript==

let intervalId = null;
let isEnabled = localStorage.getItem('redditChatAnonymizerEnabled') !== 'false';

function createToggleButton() {
    const button = document.createElement('button');
    button.textContent = `Anonymizer: ${isEnabled ? 'ON' : 'OFF'}`;
    button.style.cssText = `
        position: fixed;
        top: 10px;
        right: 100px;
        z-index: 10000;
        padding: 8px 16px;
        background-color: #1a1a1b;
        color: #d7dadc;
        border: 1px solid #343536;
        border-radius: 4px;
        cursor: pointer;
        font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
        font-size: 14px;
    `;
    button.addEventListener('click', toggleAnonymizer);
    document.body.appendChild(button);
}

function toggleAnonymizer() {
    isEnabled = !isEnabled;
    localStorage.setItem('redditChatAnonymizerEnabled', isEnabled);
    const button = document.querySelector('button');
    button.textContent = `Anonymizer: ${isEnabled ? 'ON' : 'OFF'}`;
    if (isEnabled) {
        startTimelineEventInspection();
    } else if (intervalId) {
        clearInterval(intervalId);
        intervalId = null;
        window.location.reload();
    }
}

function startTimelineEventInspection() {
    if (intervalId) clearInterval(intervalId);
    intervalId = setInterval(inspectTimelineEvents, 50);
}

function inspectTimelineEvents() {
    if (!isEnabled) return;
    const rsApp = document.querySelector('rs-app');
    const curUser = rsApp?.querySelector('rs-current-user');
    const overlayManager = rsApp?.shadowRoot?.querySelector('rs-room-overlay-manager');
    const rsRoom = overlayManager?.querySelector('rs-room');
    const timeline = rsRoom?.shadowRoot?.querySelector('rs-timeline');
    const virtualScroll = timeline?.shadowRoot?.querySelector('rs-virtual-scroll-dynamic');
    const timelineEvents = virtualScroll?.shadowRoot?.querySelectorAll('rs-timeline-event');

    if (timelineEvents) {
        timelineEvents.forEach(event => {
            const flex_col = event.shadowRoot.querySelector('rs-timeline-event-hovercard-display-name');
            const nameSpan = flex_col?.querySelector('span');
            if (nameSpan?.textContent !== curUser?.getAttribute('display-name')) {
                nameSpan.textContent = '';
                const user_avatar = event.shadowRoot.querySelector('image') || event.shadowRoot.querySelector('img');
                user_avatar.src = 'https://www.ledr.com/colours/black.jpg';
                user_avatar.setAttribute('href', user_avatar.src);
                user_avatar.onload = () => user_avatar.dispatchEvent(new CustomEvent('render', { bubbles: true }));
            }
        });
    }
}

// Initialize
setTimeout(() => {
    createToggleButton();
    if (isEnabled) startTimelineEventInspection();
}, 2000);``