Humoruniv Block User Script

Blocks posts and comments from specific users on humoruniv.com

2024-06-21 يوللانغان نەشرى. ئەڭ يېڭى نەشرىنى كۆرۈش.

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name         Humoruniv Block User Script
// @namespace    http://tampermonkey.net/
// @version      1.1
// @description  Blocks posts and comments from specific users on humoruniv.com
// @author       ChatGPT
// @match        https://m.humoruniv.com/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // 블라인드 리스트 관리 GUI 생성
    let blindList = JSON.parse(localStorage.getItem('blindList') || '[]');

    function saveBlindList() {
        localStorage.setItem('blindList', JSON.stringify(blindList));
    }

    function addUserToBlindList(nickname) {
        if (nickname && !blindList.some(user => user.nickname === nickname)) {
            blindList.push({ nickname: nickname, date: new Date().toLocaleString('ko-KR', { hour12: false }) });
            saveBlindList();
            renderBlindList();
            hidePosts();
            hideComments();
        }
    }

    function removeUserFromBlindList(nickname) {
        blindList = blindList.filter(user => user.nickname !== nickname);
        saveBlindList();
        renderBlindList();
    }

    function renderBlindList() {
        const listElement = document.getElementById('blindList');
        listElement.innerHTML = '';

        blindList.forEach(user => {
            const listItem = document.createElement('li');
            listItem.textContent = `${user.nickname} (${user.date})`;
            const removeButton = document.createElement('button');
            removeButton.textContent = '삭제';
            removeButton.onclick = () => removeUserFromBlindList(user.nickname);
            listItem.appendChild(removeButton);
            listElement.appendChild(listItem);
        });
    }

    function saveGuiState(isHidden) {
        localStorage.setItem('guiHidden', isHidden);
    }

    function loadGuiState() {
        return localStorage.getItem('guiHidden') === 'true';
    }

    // GUI 생성
    const gui = document.createElement('div');
    gui.style.position = 'fixed';
    gui.style.bottom = '10px';
    gui.style.right = '10px';
    gui.style.backgroundColor = 'white';
    gui.style.border = '1px solid black';
    gui.style.padding = '10px';
    gui.style.zIndex = 10000;

    const title = document.createElement('h3');
    title.textContent = '블라인드 리스트';
    gui.appendChild(title);

    const list = document.createElement('ul');
    list.id = 'blindList';
    gui.appendChild(list);

    const inputField = document.createElement('input');
    inputField.type = 'text';
    inputField.placeholder = '닉네임 추가';
    gui.appendChild(inputField);

    const addButton = document.createElement('button');
    addButton.textContent = '추가';
    addButton.onclick = () => {
        addUserToBlindList(inputField.value.trim());
        inputField.value = '';
    };
    gui.appendChild(addButton);

    const hideButton = document.createElement('button');
    hideButton.textContent = '숨기기';
    hideButton.onclick = () => {
        gui.style.display = 'none';
        showButton.style.display = 'block';
        saveGuiState(true);
    };
    gui.appendChild(hideButton);

    document.body.appendChild(gui);

    const showButton = document.createElement('button');
    showButton.textContent = '블라인드';
    showButton.style.position = 'fixed';
    showButton.style.bottom = '10px';
    showButton.style.right = '10px';
    showButton.style.zIndex = 10000;
    showButton.style.display = 'none';
    showButton.onclick = () => {
        gui.style.display = 'block';
        showButton.style.display = 'none';
        saveGuiState(false);
    };
    document.body.appendChild(showButton);

    if (loadGuiState()) {
        gui.style.display = 'none';
        showButton.style.display = 'block';
    } else {
        gui.style.display = 'block';
        showButton.style.display = 'none';
    }

    renderBlindList();

    // 게시글 가리기
    function hidePosts() {
        if (location.href.includes('list.html') && !location.href.includes('st=name')) {
            document.querySelectorAll('#list_body > ul > a').forEach(post => {
                const nickname = post.querySelector('#list_body > ul > a > li > table > tbody > tr > td:nth-child(2) > div > span.nick').textContent;
                if (blindList.some(user => user.nickname === nickname)) {
                    post.style.display = 'none';
                }
            });

            document.querySelectorAll('#list_best_normal > ul > a').forEach(post => {
                const nickname = post.querySelector('#list_best_normal > ul > a > li > table > tbody > tr > td > div:nth-child(3)').textContent;
                if (blindList.some(user => user.nickname === nickname)) {
                    post.style.display = 'none';
                }
            });
        }
    }

    // 댓글 가리기
    function hideComments() {
        if (location.href.includes('read.html')) {
            document.querySelectorAll('li').forEach(comment => {
                const nickname = comment.querySelector('span.nick')?.textContent;

                if (nickname && blindList.some(user => user.nickname === nickname)) {
                    if (comment.className.includes('sub_comm_bt')) {
                        comment.style.display = 'none';
                    } else if (comment.className.includes('best_li') || comment.id.includes('comment_li')) {
                        let nextElement = comment.nextElementSibling;
                        while (nextElement && nextElement.className.includes('sub_comm_bt')) {
                            nextElement.style.display = 'none';
                            nextElement = nextElement.nextElementSibling;
                        }
                        comment.style.display = 'none';
                    }
                }
            });
        }
    }

    hidePosts();
    hideComments();
})();