Created
September 26, 2023 11:39
-
-
Save nomikama/48beae280a5be29993f1da5b2c002620 to your computer and use it in GitHub Desktop.
UserScript infinite scroll main page NoobClub + filter news on titles
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ==UserScript== | |
// @name Фильтр постов на NC | |
// @namespace https://noob-club.ru/ | |
// @version 0.2 | |
// @description Бесконечный скролл новостей на главной с фильтрацией по словам в заголовке | |
// @author nomikama | |
// @match https://www.noob-club.ru/ | |
// @icon https://www.google.com/s2/favicons?sz=64&domain=noob-club.ru | |
// @grant none | |
// ==/UserScript== | |
(async function () { | |
const filterTitleWords = [ | |
"хардкорно", | |
"Фанат", | |
"косплей", | |
"Обсуждение", | |
"Подборка", | |
"Вышел новый эпизод", | |
"3D-иллюстрации", | |
"Кулинария Азерота", | |
"Dark Legacy Comics", | |
]; | |
let firstRender = true; | |
let lastPageNumber = 0; | |
function getPageLink(pageNumber = 1) { | |
pageNumber -= 1; | |
const url = "https://www.noob-club.ru/index.php?frontpage;p="; | |
const countNews = 15; | |
const currentPage = pageNumber * countNews; | |
lastPageNumber = pageNumber + 1; | |
return url + currentPage; | |
} | |
async function getNews(url) { | |
try { | |
const request = await fetch(url); | |
const response = await request.text(); | |
const content = new DOMParser().parseFromString(response, "text/html"); | |
const newsList = content.querySelectorAll(".entry"); | |
return Array.from(newsList); | |
} catch (error) { | |
console.log(error); | |
return []; | |
} | |
} | |
async function filterNews(data, filterWords, reverse = false) { | |
const content = await data; | |
const result = content.filter((news) => { | |
const title = news.querySelector("h1"); | |
const check = filterWords.some((word) => { | |
return title.textContent.toLowerCase().includes(word.toLowerCase()); | |
}); | |
if (reverse) { | |
return check; | |
} | |
return !check; | |
}); | |
return result; | |
} | |
function preload(item) { | |
const options = { | |
rootMargin: "0px", | |
threshold: 0, | |
}; | |
function lazyHandler(entries, observer) { | |
entries.forEach(function (entry) { | |
if (entry.isIntersecting) { | |
run(lastPageNumber + 1); | |
observer.disconnect(); | |
} | |
}); | |
} | |
const io = new IntersectionObserver(lazyHandler, options); | |
io.observe(item); | |
} | |
async function render(content) { | |
const parent = document.querySelector(".content"); | |
const featuresBox = parent.querySelector(".features-box"); | |
const newsList = await content; | |
if (firstRender) { | |
parent.innerHTML = ""; | |
parent.append(featuresBox); | |
} | |
firstRender = false; | |
if (newsList.length > 4) { | |
preload(newsList.at(-3)); | |
} | |
newsList.forEach((post) => parent.append(post)); | |
} | |
async function run(page) { | |
return render(filterNews(getNews(getPageLink(page)), filterTitleWords)); | |
} | |
run(1); | |
})(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment