Skip to content

Instantly share code, notes, and snippets.

@nomikama
Created September 26, 2023 11:39
Show Gist options
  • Save nomikama/48beae280a5be29993f1da5b2c002620 to your computer and use it in GitHub Desktop.
Save nomikama/48beae280a5be29993f1da5b2c002620 to your computer and use it in GitHub Desktop.
UserScript infinite scroll main page NoobClub + filter news on titles
// ==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