피탕메이트

갤질좀 편하게 하자

Verzia zo dňa 24.04.2022. Pozri najnovšiu verziu.

// ==UserScript==
// @name         피탕메이트
// @namespace    http://tampermonkey.net/
// @version      3.1
// @description  갤질좀 편하게 하자
// @author       수린
// @license      MIT
// @match        https://gall.dcinside.com/*lists*
// @icon64       https://i.imgur.com/7SKZDdS.png
// @require      http://code.jquery.com/jquery-latest.js
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_xmlhttpRequest
// @grant        GM_addStyle
// ==/UserScript==

function pushKillList(word) {
    let currentList = GM_getValue("차단목록");
    //alert(currentList.indexOf(word));
    if (currentList.indexOf(word) > -1) {
        currentList.splice(currentList.indexOf(word), 1);
        GM_setValue("차단목록", currentList);
        alert(word + " 차단목록 제거 완료");
    } else {
        alert(word + " 차단목록 추가 완료");
        currentList.push(word);
        GM_setValue("차단목록", currentList);
    }
}

function kill(list) {
    let killList = GM_getValue("차단목록");
    for (let elem of list.querySelectorAll('.ub-content.us-post')) {
        if (killList.indexOf(elem.querySelector('.gall_writer.ub-writer').getAttribute("data-uid")) > -1
            || killList.indexOf(elem.querySelector('.gall_writer.ub-writer').getAttribute("data-ip")) > -1
            || killList.indexOf(elem.querySelector('.gall_writer.ub-writer').getAttribute("data-nick")) > -1) {
            elem.remove();
        }
        let title = elem.querySelector('.gall_tit.ub-word').innerText;
        for (let i of killList) {
            let REG = RegExp(i);
            if (REG.exec(title)) {
                elem.remove();
            }
        }
    }
}

function killComment(commentList) {
    let killList = GM_getValue("차단목록");
    //댓글돌이
    for (let elem of commentList.querySelectorAll('.ub-content.dory')) {
        elem.remove();
    }
    for (let elem of commentList.querySelectorAll('.ub-content')) {
        if (elem.querySelector('.gall_writer.ub-writer')) {
            if (killList.indexOf(elem.querySelector('.gall_writer.ub-writer').getAttribute("data-uid")) > -1
                || killList.indexOf(elem.querySelector('.gall_writer.ub-writer').getAttribute("data-ip")) > -1
                || killList.indexOf(elem.querySelector('.gall_writer.ub-writer').getAttribute("data-nick")) > -1) {
                elem.remove();
            }
            let text;
            if (elem.querySelector('.clear.cmt_txtbox.btn_reply_write_all')) {
                text = elem.querySelector('.clear.cmt_txtbox.btn_reply_write_all').innerText;
            } else {
                text = elem.querySelector('.clear.cmt_txtbox').innerText;
            }
            for (let i of killList) {
                let REG = RegExp(i);
                if (REG.exec(text)) {
                    elem.remove();
                }
            }
        }

    }
}

async function MakeGallList() {
    let loadInterval = null;
    let popupInterval = null;

    if (GM_getValue("previewOn") == true) {

        $("#popup_preview").hover(
            function() {
                clearTimeout(popupInterval);
            },
            function() {
                clearTimeout(popupInterval);
                popupInterval = setTimeout(function() {
                    $("#popup_preview").stop(true,true).fadeOut(200, function() {
                        $("#popup_preview .content").empty();
                    });
                }, 20);
            }
        ).on("click", function(eve) {
            //if($(eve.target).hasClass("content")) {
            $("#popup_preview").stop(true,true).fadeOut(200, function() {
                $("#popup_preview .content").empty();
            });
        });

        //리스트에 하우스 호버중일때
        $(".gall_list tr.ub-content").hover(
            function() {
                //clearTimeout(popupInterval);
            },
            function() {
                clearTimeout(loadInterval);
                clearTimeout(popupInterval);
                popupInterval = setTimeout(function() {
                    $("#popup_preview").stop(true,true).fadeOut(20, function() {
                        $("#popup_preview .content").empty();
                    });
                }, 200);
            }
        );
        function popupShow(target, eve, content) {
            var scrollX = $(window).scrollLeft();
            var scrollY = $(window).scrollTop();
            $("#popup_preview")
                .stop(true,true)
            //.hide()
                .css({ left:eve.pageX + 30, top:(eve.clientY - 20) + scrollY})
                .find(".content")
                .html(content)
                .outerHeight()
            ;
            $("#popup_preview").fadeIn(200, function() {
                var popupHeight = $(this).find(".content").scrollTop(0).outerHeight();
                var popupTop = (eve.clientY - 20) - popupHeight;
                if(popupTop < -10) {
                    $(this).css("top","+=" + (Math.abs(popupTop) + 10));
                }
            });
        }
    }

    await fetch(window.location.href)
        .then((response) => response.text())
        .then((result) => {
        result = result.substr(result.indexOf('"gall_list"') + 13, result.length);
        result = result.substr(0, result.indexOf("table") - 2);
        let list = document.createElement('table');
        list.innerHTML = result;
        kill(list);
        document.querySelector('.gall_list').innerHTML = list.innerHTML;
        if (GM_getValue("previewOn") == true) {
            let now = new Date();
            let date = now.getFullYear().toString() + (now.getMonth() + 1).toString() + now.getDate().toString();
            let broadId = location.href.split("id=")[1].split("&")[0];
            $(".gall_list .gall_tit > a:not(.reply_numbox)").hover(
                function(eve) {
                    if ($(this).parent().prev('.gall_num').text() == "공지") return;
                    var target = $(this);
                    var event = eve;
                    var link = $(this).attr("href");
                    var id = link.split("id=")[1].split("&")[0];
                    var no = link.split("no=")[1].split("&")[0];
                    var contentId = id + "_" + no + "_" + date;
                    clearTimeout(loadInterval);
                    loadInterval = setTimeout(function() {
                        var loadContent = localStorage.getItem(contentId);
                        if(loadContent != undefined && loadContent != null && loadContent !== "") {
                            popupShow(target, event, loadContent);
                        }
                        else {
                            GM_xmlhttpRequest({
                                method: "GET",
                                url: link,
                                overrideMimeType:"text/html; charset=utf-8",
                                headers:{
                                    "Content-Type": "text/html; charset=utf-8",
                                    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36",
                                    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8"
                                },
                                onload: function(response) {
                                    if(response && response.responseText != undefined) {
                                        if(response.responseText.indexOf("derror/deleted") > -1) {
                                            var content = "※삭제된 글입니다.";
                                            localStorage.setItem(contentId, content);
                                            popupShow(target, event, content);
                                        }
                                        else {
                                            var viewContent = $(response.responseText).find(".view_content_wrap .writing_view_box");
                                            if(viewContent.length > 0) {
                                                viewContent.find("script,style").remove();
                                                content = viewContent.html();
                                                localStorage.setItem(contentId, content);
                                                popupShow(target, event, content);
                                            }
                                        }
                                    }
                                }
                            });
                        }
                    }, 200);
                },
                function() {
                    clearTimeout(loadInterval);
                }
            );
        }
    });
}

function addSetting() {
    //설정 버튼
    document.querySelector(".array_tab.left_box").insertAdjacentHTML('beforeend', `<button class="on" id="settingButton">설정</button>`);
    document.querySelector("#settingButton").addEventListener("click", (event)=> {
        document.querySelector('.settingBox').style.display = 'block'
        document.querySelector('.settingBox').style.left = `${event.clientX - 290}px`;
        document.querySelector('.settingBox').style.top = `${event.clientY}px`;
        event.stopPropagation()
    });
    //설정 창
    document.querySelector("body").insertAdjacentHTML('beforeend', `<div class="settingBox"></div>`);
    //차단 박스
    document.querySelector('.settingBox').insertAdjacentHTML('beforeend', `<div class="box" id="killBox"></div>`);
    document.querySelector('#killBox').innerHTML = `<div class="settingExplanationKill"><div style="text-align:center"><h1>현재 차단목록</h1></div><div style="margin:5px;">목록에 이미 있다면 목록에서 제거함</div><div style="margin:5px; border:1px solid; border-radius:5px; height:230px">${GM_getValue("차단목록")}</div></div>`;
    document.querySelector('#killBox').insertAdjacentHTML('beforeend', `<div style="height:7%; margin:2%;"><input id="killInput" type="text" placeholder="차단할 단어/고닉 or id or ip" style="width:96%"></input></div>`);
    document.querySelector("#killBox").insertAdjacentHTML('beforeend',`<div style="width: 82px; margin:0 auto;"><button class="button off" id="addKillButton">추가</button><div>`);
    document.querySelector("#addKillButton").addEventListener("click", (event)=> {
        pushKillList(document.querySelector("#killInput").value);
        document.querySelector('.settingExplanationKill').innerHTML = `<div style="text-align:center"><h1>현재 차단목록</h1></div><div style="margin:5px;">목록에 이미 있다면 목록에서 제거함</div><div style="margin:5px; border:1px solid; border-radius:5px; height:230px">${GM_getValue("차단목록")}</div>`;
        document.querySelector("#killInput").value = "";
    });
    //미리보기 박스
    document.querySelector('.settingBox').insertAdjacentHTML('beforeend',`<div id="previewBox" class="box3"><div style="text-align:center"><h1>글 미리보기 설정</h1></div><div style="margin:5px;">글 제목에 마우스 올리면 미리보기창 팝업해줌</div></div>`);
    if (GM_getValue("previewOn") == true) {
        document.querySelector("#previewBox").insertAdjacentHTML('beforeend',`<div style="width: 82px; margin:0 auto;"><button id="previewButton" class="button on">끄기</button></div>`);
    } else {
        document.querySelector("#previewBox").insertAdjacentHTML('beforeend',`<div style="width: 82px; margin:0 auto;"><button id="previewButton" class="button off">켜기</button></div>`);
    }
    document.querySelector("#previewButton").addEventListener("click", (event)=> {
        if (GM_getValue("previewOn") == true) {
            GM_setValue("previewOn", false);
            MakeGallList();
            $("#popup_preview").stop(true,true).fadeOut(100, function() {
                $("#popup_preview .content").empty();
            });
            document.querySelector("#previewButton").className = "";
            document.querySelector("#previewButton").innerHTML = "켜기";
        } else {
            GM_setValue("previewOn", true);
            MakeGallList();
            document.querySelector("#previewButton").className = "button on";
            document.querySelector("#previewButton").innerHTML = "끄기";
        }
    });
    //새로고침 박스
    document.querySelector('.settingBox').insertAdjacentHTML('beforeend',`<div id="reloadBox" class="box2"><div style="text-align:center"><h1>글 자동 새로고침 설정</h1></div><div style="margin:5px;">지정된 시간 간격마다 글 목록 자동 새로고침해줌<br>현재 ${GM_getValue("reloadInterval")}ms</div></div>`);
    document.querySelector('#reloadBox').insertAdjacentHTML('beforeend', `<div style="height:15%; margin:2%;"><input id="reloadIntervalInput" type="number" placeholder="설정할 시간 간격 (ms)" style="width:96%"></input></div>`);
    document.querySelector("#reloadBox").insertAdjacentHTML('beforeend',`<div style="float:left; width: 82px; margin-left:15% ;"><button class="button off" id="setReloadIntervalButton">설정</button><div>`);
    document.querySelector("#setReloadIntervalButton").addEventListener("click", (event)=> {
        GM_setValue("reloadInterval", document.querySelector("#reloadIntervalInput").value);
        alert("설정 완료, 새로고침 합니다");
        window.location.reload();
    });
    if (GM_getValue("reloadOn") == true) {
        document.querySelector("#reloadBox").insertAdjacentHTML('beforeend',`<div style="float:right; width: 82px; margin-right:15%"><button id="reloadButton" class="button on">끄기</button></div>`);
    } else {
        document.querySelector("#reloadBox").insertAdjacentHTML('beforeend',`<div style="float:right; width: 82px; margin-right:15%"><button id="reloadButton" class="">켜기</button></div>`);
    }
    document.querySelector("#reloadButton").addEventListener("click", (event)=> {
        if (GM_getValue("reloadOn") == true) {
            GM_setValue("reloadOn", false);
            document.querySelector("#reloadButton").className = "";
            document.querySelector("#reloadButton").innerHTML = "켜기";
        } else {
            GM_setValue("reloadOn", true);
            document.querySelector("#reloadButton").className = "button on";
            document.querySelector("#reloadButton").innerHTML = "끄기";
        }
    });
    //글 읽기 팝업
    document.querySelector('.settingBox').insertAdjacentHTML('beforeend',`<div id="readPopup" class="box3"><div style="text-align:center"><h1>글 읽기 팝업</h1></div><div style="margin:5px;">글 누르면 페이지 이동 안하고 팝업으로 보여줌</div></div>`);
    if (GM_getValue("readPopupOn") == true) {
        document.querySelector("#readPopup").insertAdjacentHTML('beforeend',`<div style="width: 82px; margin:0 auto;"><button id="readPopupButton" class="button on">끄기</button></div>`);
    } else {
        document.querySelector("#readPopup").insertAdjacentHTML('beforeend',`<div style="width: 82px; margin:0 auto;"><button id="readPopupButton" class="">켜기</button></div>`);
    }
    document.querySelector("#readPopupButton").addEventListener("click", (event)=> {
        if (GM_getValue("readPopupOn") == true) {
            GM_setValue("readPopupOn", false);
            document.querySelector('.gall_listwrap.list').onclick ="";
            document.querySelector("#readPopupButton").className = "button off";
            document.querySelector("#readPopupButton").innerHTML = "켜기";
        } else {
            GM_setValue("readPopupOn", true);
            readPopup();
            document.querySelector("#readPopupButton").className = "button on";
            document.querySelector("#readPopupButton").innerHTML = "끄기";
        }
    });
    //닫기 버튼
    document.querySelector(".settingBox").insertAdjacentHTML('beforeend', `<div style="width: 82px; margin:0 auto;"><button id="closeButton" class="button off">닫기</button></div>`);
    document.querySelector("#closeButton").addEventListener("click", ()=>{document.querySelector('.settingBox').style.display = 'none';});
}

function readPopup() {
    document.querySelector('body').addEventListener("click", (event) => {
        if (document.querySelector('#view')) {
            document.querySelector('#view').remove();
        }

    });
    document.querySelector('.gall_listwrap.list').onclick = function(event) {
        if (event.target.nodeName != 'A') return;
        if (document.querySelector('#view')) {
            document.querySelector('#view').remove();
        }
        let href = event.target.getAttribute('href');

        $("#popup_preview").stop(true,true).fadeOut(100, function() {
            $("#popup_preview .content").empty();
        });

        document.querySelector('body').insertAdjacentHTML('afterbegin', `
        <div id="view"; style="position:absolute; z-index: 20; opacity:1; left:${event.clientX - 100}px; top:5%; border-radius:5px; background-color:white; opacity:1; border:1px solid;box-shadow:1px 1px 5px rgba(0,0,0,0.3); max-width:1000px; width:80%; height:90%; float:left">
            <iframe id="iframe" src="${href}" width='100%' height='100%'></iframe>
        </div>`);
        //--------------------------------------------------------------------------------------------------------------
        //지저분한거 정리
        let interval = setInterval(() => {
            if (document.querySelector('#iframe')) {
                let iframeDocument = document.querySelector('#iframe').contentDocument;
                iframeDocument.querySelector(".right_content").querySelector('div').hidden = true;
                iframeDocument.querySelector('.dchead').hidden = true;
                iframeDocument.querySelector('.gnb_bar').hidden = true;
                if (iframeDocument.querySelector('.dcwiki')) {
                    iframeDocument.querySelector('.dcwiki').hidden = true;
                }
                iframeDocument.querySelector('.fr.gall_issuebox').hidden = true;
                for (let elem of iframeDocument.querySelectorAll(".content_box")) {
                    elem.hidden = true;
                }
                let dcfoot = iframeDocument.querySelector('.dcfoot.type1');
                for (let elem of dcfoot.querySelectorAll('div')) {
                    elem.hidden = true;
                }
                iframeDocument.querySelector("#top").style.width='0%';
                iframeDocument.querySelector("#top").style.minWidth='0px';
                iframeDocument.querySelectorAll(".wrap_inner")[0].style.width='50%';
                iframeDocument.querySelectorAll(".wrap_inner")[0].marginLeft='0 auto';
                iframeDocument.querySelectorAll("article")[1].style.width='0%';
                iframeDocument.querySelectorAll("article")[1].style.minWidth='1000px';
                iframeDocument.querySelector('.con_banner.writing_banbox').style.minHeight='0px';
                iframeDocument.querySelector("#container").style.marginLeft='0 auto';
                iframeDocument.querySelector("#container").style.marginRight='0 auto';
                iframeDocument.querySelector('.gall_listwrap.list').hidden = true;
                iframeDocument.querySelector('.listwrap.clear').hidden = true;
                //iframeDocument.querySelector('.view_bottom_btnbox.clear').hidden = true;
                iframeDocument.querySelector('.page_head.clear').hidden = true;
                iframeDocument.querySelector('.stickyunit').style.width='0%';
                iframeDocument.querySelector('.issue_wrap').hidden = true;
                if (iframeDocument.querySelector('.comment_box')) killComment(iframeDocument.querySelector('.comment_box'));
                clearInterval(interval);
            }
        }, 100);
        event.stopPropagation()
        return false;
    };
}

function addStyle() {
    GM_addStyle(`
            #popup_preview{position:absolute;z-index:10000; top:0px;}#popup_preview
            .content{position:absolute;left:0;bottom:0;padding:15px;width:600px;
            max-height:1000px;
            min-height:100px;
            line-height:20px;
            font-size:12px;
            opacity:1;
            color:#ffffff;
            border:1px solid #ddd;
            border-radius:5px;
            background:#262626;
            overflow:auto}
            #popup_preview img{max-width:30%}
            #popup_preview iframe,#popup_preview embed{width:100%;height:auto;min-height:240px}
            </style>`);

    GM_addStyle(`.settingBox{
    position: absolute;
    width: 580px;
    height: 420px;
    display: none;
    border-radius:5px;
    background-color: #262626;
    z-index: 20000;
    }`);
    GM_addStyle(`.box{
    width:48%;
    height:370px;
    border-radius:5px;
    float:left;
    margin: 5px;
    background-color: #fff;
    }`);
    GM_addStyle(`.box2{
    width:48%;
    height:150px;
    border-radius:5px;
    float:left;
    margin: 5px;
    background-color: #fff;
    }`);
    GM_addStyle(`.box3{
    width:48%;
    height:100px;
    border-radius:5px;
    float:left;
    margin: 5px;
    background-color: #fff;
    }`);
    GM_addStyle(`.button{
    width:82px;
    height:32px;
    border-radius:2px;
    font-size:14px;
    margin-left:2px;
    font-weight:bold;
    }`);
    GM_addStyle(`.on{
    border:1px solid #29367c;
    background:#3b4890;
    color:#fff;
    text-shadow: 0px -1px #1d2761
    }`);
    GM_addStyle(`.off{
    border:1px solid #ccc;
    color:#333;
    background:#fff;
    padding-bottom:2px
    }`);

    $("body").append('<div id="popup_preview"><div class="content"></div></div>');
}

$(function () {
    'use strict';
    addStyle();
    if (GM_getValue("reloadOn") == null) {
        GM_setValue("reloadOn", true)
    }
    if (GM_getValue("reloadInterval") == null) {
        GM_setValue("reloadInterval", 1000)
    }
    if (GM_getValue("previewOn") == null) {
        GM_setValue("previewOn", true)
    }
    if (GM_getValue("readPopupOn") == null) {
        GM_setValue("readPopupOn", true)
    }
    //--------------------------------------------------------------------------------------------------------------
    //지저분한거 정리
    $("#top").width='100%';
    document.querySelector("#top").style.minWidth='600px';
    document.querySelectorAll(".wrap_inner")[0].style.width='100%';
    document.querySelector("#container").style.marginLeft='0 auto';
    document.querySelector("#container").style.marginRight='0 auto';
    document.querySelector(".right_content").querySelector('div').hidden = true;
    document.querySelector('.dchead').hidden = true;
    document.querySelector('.gnb_bar').hidden = true;
    if (document.querySelector('.dcwiki')) document.querySelector('.dcwiki').hidden = true;
    document.querySelector('.fr.gall_issuebox').hidden = true;
    for (let elem of document.querySelectorAll(".content_box")) {
        elem.hidden = true;
    }
    let dcfoot = document.querySelector('.dcfoot.type1');
    for (let elem of dcfoot.querySelectorAll('div')) {
        elem.hidden = true;
    }
    let search = document.querySelector('#search_wrap');
    search.className = "";
    document.querySelector('.left_content').prepend(search);
    document.querySelector('.btn_visit').style.position = 'relative';
    //--------------------------------------------------------------------------------------------------------------
    //새 버튼들
    let login = document.querySelector('.area_links.clear').querySelectorAll('li');
    let login_btn = login[login.length - 1];
    document.querySelector(".array_tab.left_box").insertAdjacentHTML('beforeend', `<button class="on">${document.querySelector('.user_info').innerText}</button>`);
    document.querySelector(".array_tab.left_box").insertAdjacentHTML('beforeend', `<button class="">${login_btn.innerHTML}</button>`);
    //--------------------------------------------------------------------------------------------------------------
    //글 읽기 iframe
    if (GM_getValue("readPopupOn") == true) {
        readPopup();
    }
    //--------------------------------------------------------------------------------------------------------------
    //리스트 새로고침
    setInterval(() => {
        if (GM_getValue("reloadOn") == true) {
            MakeGallList();
        }
    }, GM_getValue("reloadInterval"));
    //--------------------------------------------------------------------------------------------------------------
    //리스트 글 수
    if (document.querySelector('.select_area').querySelector('a').innerText != "30개") {
        //alert("글 리스트 30개로 바꿈");
        //listDisp(30);
    }
    addSetting();
})();
长期地址
遇到问题?请前往 GitHub 提 Issues。