// ==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();
})();