Skip to content

Instantly share code, notes, and snippets.

@hadongsoo
Last active February 24, 2020 10:59
Show Gist options
  • Save hadongsoo/37a7739b9f3945111959cb438b3123b6 to your computer and use it in GitHub Desktop.
Save hadongsoo/37a7739b9f3945111959cb438b3123b6 to your computer and use it in GitHub Desktop.
tgd hotclip keyword block
// ==UserScript==
// @name tgd_hotclick_block
// @version 1
// @grant none
// @include *://tgd.kr/clips*
// @run-at document-end
// @grant GM_addStyle
// ==/UserScript==
GM_addStyle(`
.btn_ban {
color:red;
width:15px;
height:15px;
margin:2px 0;
vertical-align: top;
padding: 2px;
font-size: 10px;
line-height: 12px;
display: inline-block;
border:0;
background:none;
}
.btn_ban:hover {
background:rgba(0,0,0,0.2);
}
`);
let listWrapper = '.frame',
listItem = '.clips',
clipTitle = '.clip-launch',
clipStreamer = '.streamer';
// 클립명 필터링
let blockList = [
'blockKeyword',
'[AD]',
'(광고)',
]
// 최초 스트리머 필터링 사전 추가
let firstStreamerList = [
"한동숙",
"얍얍",
"자동",
"룩삼",
"따효니",
"김영일",
"공혁준",
"똘똘똘이_",
"로복_",
"탠타임",
"바퀴아재",
"박옥자누나",
"러너",
"gua_seo",
"야매인생",
"껨구",
"뽀삐짱",
"노래앙법",
"해공이랑",
"밍모",
"이브티",
"친절한윤석씌",
"크랭크_",
"배르니",
"렐라",
"차숭어",
"힘의길",
"혁찌니",
"즐디",
"국인11",
"김끠자",
"쌍베",
"복승하_",
"청년문규",
"케인",
"소우릎",
"소녀공장",
"백구ㅎㅅㅎ",
"새안",
"요룰레히",
"샌드백",
"짬타수아",
"꽃빈",
"철면수심",
"두더지__",
"키마리오",
"플러리",
"앰비션_",
"담백한종훈이",
"금다정",
"487577612",
"487729032"
]
let tempStreamerList = [
]
let numberStreamerList = {
235491613:'MSFIIIRE',
471919376:'텐텐2'
}
if (!localStorage.getItem("streamLocalList")) {
localStorage.setItem("streamLocalList", JSON.stringify(firstStreamerList));
}
if (!localStorage.getItem("tStreamerList")) {
localStorage.setItem("tStreamerList", JSON.stringify(tempStreamerList));
// console.log('없어서 만듬 temp');
}
if (!localStorage.getItem("nStreamerList")) {
localStorage.setItem("nStreamerList", JSON.stringify(numberStreamerList));
// console.log('없어서 만듬 numberStreamerList');
}
// console.log(tStreamerList);
let streamLocalList = JSON.parse(localStorage.getItem("streamLocalList"));
let tStreamerList = JSON.parse(localStorage.getItem("tStreamerList"));
let nStreamerList = JSON.parse(localStorage.getItem("nStreamerList"));
if (streamLocalList){
console.log(streamLocalList);
}
if (tStreamerList){
console.log(tStreamerList);
}
// make messege wrapper
if (!document.querySelector('.alertify-logs')){
let alertify = `<div class="alertify-logs bottom left"></div>`;
document.body.insertAdjacentHTML('beforeend', alertify);
}
const getCookie = ( name ) => {
var nameOfCookie = name + "=";
var x = 0;
while ( x <= document.cookie.length )
{
var y = (x+nameOfCookie.length);
if ( document.cookie.substring( x, y ) == nameOfCookie ) {
if ( (endOfCookie=document.cookie.indexOf( ";", y )) == -1 )
endOfCookie = document.cookie.length;
return unescape( document.cookie.substring( y, endOfCookie ) );
}
x = document.cookie.indexOf( " ", x ) + 1;
if ( x == 0 )
break;
}
return "";
};
const setCookieAt = ( name, expiredays) => {
let dawnTime = 4*60*60*1000;
let todayDate = new Date();
todayDate = new Date(parseInt(todayDate.getTime() / 86400000) * 86400000 + 54000000 + dawnTime);
if ( todayDate > new Date() ) {
expiredays = expiredays - 1;
}
todayDate.setDate( todayDate.getDate() + expiredays );
// console.log('cookie set, it will delete : ', todayDate);
document.cookie = name + "=" + name + "; path=/; expires=" + todayDate.toGMTString() + ";";
console.log(todayDate.toGMTString(), todayDate);
};
// setCookieAt('test01',1);
const deleteCookie = (name) => {
let date = new Date();
let newDate = new Date(date.setDate(date.getDate() - 1));
// console.log('지우는거 안에서', newDate, newDate.toGMTString());
document.cookie = name + "=" + name + "; path=/; expires=" + newDate.toGMTString() + ";";
console.log(getCookie(name));
};
// deleteCookie('tStreamer');
// remove temp streamer list everyday
const tempStreamerListCleaner = () => {
// let blnCookie = getCookie('tStreamer');
if( !getCookie('tStreamer') ) {
// console.log('쿠키없음 그래서 temp streamer list 초기화');
localStorage.setItem("tStreamerList", JSON.stringify([]));
tStreamerList = JSON.parse(localStorage.getItem("tStreamerList"));
// console.log('deleted', tStreamerList);
} else {
console.log('아직 쿠키 아직 있음', getCookie('tStreamer'));
}
};
tempStreamerListCleaner();
// remove unnecessary div
(function (nodes){
let nodez = document.querySelectorAll(nodes);
nodez.forEach(item => {
if(item.nextElementSibling.className === '' && item.nextElementSibling.style.length === 0){
item.nextElementSibling.style.display = 'none';
}
item.style.display = 'inline'
});
})('.r');
// remover by blacklist
const remover = function (wrapper, node) {
let target = document.querySelector(wrapper),
clips = target.querySelectorAll(node);
clips.forEach(clip => {
if (clip.querySelector(clipStreamer).textContent === '') {
let urlHref = clip.querySelector(clipStreamer).href;
let streamerIDnumber = urlHref.match(/([0-9]{9})/);
let tempName = Array.from(streamerIDnumber)[0];
// for in object
for (var key in nStreamerList) {
if (nStreamerList.hasOwnProperty(key)) {
if (tempName == key){
// console.log(numberStreamerList[key]);
tempName = nStreamerList[key];
}
}
}
// console.log(tempName);
clip.querySelector(clipStreamer).textContent = tempName;
}
});
clips.forEach(clip => {
// for keyword
blockList.forEach(block => {
if(clip.textContent.includes(block)) {
// console.log(clip.querySelector(clipTitle).textContent);
clip.style.display = 'none';
//clip.remove();
}
})
});
clips.forEach(clip => {
// for streamer name
streamLocalList.forEach(st => {
if (clip.querySelector(clipStreamer).textContent.includes(st)) {
//console.log(clip.querySelector(clipTitle).textContent);
clip.style.display = 'none';
//clip.remove();
}
});
});
clips.forEach(clip => {
if (tStreamerList) {
tStreamerList.forEach(st => {
if (clip.querySelector(clipStreamer).textContent.includes(st)) {
//console.log(clip.querySelector(clipTitle).textContent);
clip.style.display = 'none';
//clip.remove();
}
});
}
});
};
remover(listWrapper, listItem);
// streamer name click 2 second, add block
(function (wrapper, node) {
let wrap = document.querySelector(wrapper),
clips = wrap.querySelectorAll(node);
let undofunc = (makeItTarget) => {
if (makeItTarget) {
let newMakeItTarget = "" + makeItTarget;
console.log(newMakeItTarget);
let streamLocalList = JSON.parse(localStorage.getItem("streamLocalList"));
streamLocalList.splice(streamLocalList.indexOf(newMakeItTarget),1);
localStorage.setItem("streamLocalList", JSON.stringify(streamLocalList));
//console.log('undo');
} else {
let streamLocalList = JSON.parse(localStorage.getItem("streamLocalList"));
streamLocalList.pop();
localStorage.setItem("streamLocalList", JSON.stringify(streamLocalList));
//console.log('undo');
}
kickMessege(1);
location.reload();
}
let putMessege = (makeItTarget) => {
//let streamLocalList = JSON.parse(localStorage.getItem("streamLocalList")),
// lastStreamLocalList = streamLocalList[streamLocalList.length - 1];
let messegeWrapper = document.querySelector('.alertify-logs');
if(messegeWrapper.childNodes[0]) {
messegeWrapper.childNodes[0].remove();
}
let messegeMarkUp = `<div class="success">${makeItTarget} <a href="#">Undo</a></div>`;
messegeWrapper.insertAdjacentHTML('beforeend', messegeMarkUp);
let notiBar = messegeWrapper.querySelector('.success'),
aButton = notiBar.querySelector('a');
window.setTimeout(()=>{
notiBar.classList.add('show');
}, 500);
//console.log(messegeWrapper.childNodes[0], messegeWrapper.children[0]);
aButton.addEventListener('click',() => {undofunc(makeItTarget)});
}
let kickMessege = (timing) => {
let notiBar = document.querySelector('.alertify-logs .success');
notiBar.className = "success";
window.setTimeout(()=>{
notiBar.remove();
}, 2 * 1000);
}
clips.forEach(clip => {
let streamer = clip.querySelector('.streamer'),
streamerParent = streamer.parentNode,
streamerSibling = streamer.nextSibling;
let btn = document.createElement("button");
btn.innerHTML = "❌";
btn.classList.add('btn_ban');
btn.addEventListener('click', () => {
let makeItTarget = streamer.textContent;
streamLocalList.push(makeItTarget);
localStorage.setItem("streamLocalList", JSON.stringify(streamLocalList));
// console.log(JSON.parse(localStorage.getItem("streamLocalList")));
// clip.style.display = 'none';
remover(listWrapper, listItem);
putMessege(makeItTarget);
});
let btn2 = document.createElement("button");
btn2.innerHTML = "✖️";
btn2.classList.add('btn_ban');
btn2.addEventListener('click', () => {
let makeItTarget = streamer.textContent;
tStreamerList.push(makeItTarget);
// localStorage.setItem("streamLocalList", JSON.stringify(streamLocalList));
localStorage.setItem("tStreamerList", JSON.stringify(tStreamerList));
console.log(JSON.parse(localStorage.getItem("tStreamerList")));
setCookieAt('tStreamer', 1);
console.log(getCookie('tStreamer'));
// clip.style.display = 'none';
remover(listWrapper, listItem);
putMessege(makeItTarget);
});
streamerParent.insertBefore(btn, streamerSibling);
streamerParent.insertBefore(btn2, streamerSibling);
//streamerParent.appentChild(btn);
});
})(listWrapper, listItem);
@hadongsoo
Copy link
Author

change process, click event => create btn

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment