您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Wykop XS - Darmowy dostęp do Mikroczatu. Dodatkowe funkcje na wykopie: animowane avatary, przywrócenie listy plusujących wpisy i komentarze oraz przycisku Ulubione
// ==UserScript== // @name Wykop XS - Lista plusujących, animowane awatary, mikroczat // @name:pl Wykop XS - Lista plusujących, animowane awatary, mikroczat // @name:en Wykop XS - Lista plusujących, animowane awatary, mikroczat // @version 3.0.81 // @description Wykop XS - Darmowy dostęp do Mikroczatu. Dodatkowe funkcje na wykopie: animowane avatary, przywrócenie listy plusujących wpisy i komentarze oraz przycisku Ulubione // @description:en Wykop XS - Darmowy dostęp do Mikroczatu. Dodatkowe funkcje na wykopie: animowane avatary, przywrócenie listy plusujących wpisy i komentarze oraz przycisku Ulubione // Chcesz wesprzeć projekt Wykop X? Postaw kawkę: // @contributionURL https://buycoffee.to/wykopx // @author Wykop X <[email protected]> // @match https://wykop.pl/* // @supportURL http://wykop.pl/tag/wykopx // @namespace Violentmonkey Scripts // @compatible chrome, firefox, opera, safari, edge // @license No License // @icon https://www.google.com/s2/favicons?sz=64&domain=wykop.pl // @require https://unpkg.com/[email protected]/dist/localforage.min.js // @require https://cdn.jsdelivr.net/npm/[email protected]/dayjs.min.js // @require https://cdn.jsdelivr.net/npm/[email protected]/locale/pl.js // @require https://cdn.jsdelivr.net/npm/[email protected]/plugin/relativeTime.js // ==/UserScript== 'use strict'; const currentVersion = "3.0.80"; let dev = true; const promoString = " - Wykop XS / #wykopx"; const root = document.documentElement; const head = document.head; const body = document.body; const bodySection = body.querySelector("section"); dayjs.locale("pl"); dayjs.extend(window.dayjs_plugin_relativeTime); //dayjs.extend(relativeTime); // https://day.js.org/docs/en/plugin/relative-time // https://www.jsdelivr.com/package/npm/dayjs?tab=files&path=plugin const wykopxSettings = getComputedStyle(head); const settings = {}; const styleElement = document.createElement('style'); styleElement.id = "wykopxs_mikroczat"; let CSS = ""; function setSettingsValueFromCSSProperty(settingName, defaultValueForWykopXS = true, propertyValueInsteadOfBoolean = false) { if (propertyValueInsteadOfBoolean) settings[settingName] = wykopxSettings.getPropertyValue(`--${settingName}`) ? wykopxSettings.getPropertyValue(`--${settingName}`).trim() : defaultValueForWykopXS; else settings[settingName] = wykopxSettings.getPropertyValue(`--${settingName}`) ? wykopxSettings.getPropertyValue(`--${settingName}`).trim() === '1' : defaultValueForWykopXS; } //setSettingsValueFromCSSProperty("WykopXSEnabled"); //if (settings.WykopXSEnabled == false) return; /* WYKOP XS HEADER */ /* --- ZMIANA USTAWIEŃ --- jeśli chcesz zmienić domyślne ustawienia nie zmieniaj ich w tym kodzie. Zmień je w przeglądarce w następujący sposób: 1. Wejdź na Wykop 2. Otwórz panel narzędzi deweloperskich klawiszem *F12* lub skrótem klawiaturowym *CTRL* + *SHIFT* + *C* 3. Przejdź na zakładkę "Aplikacja" 4. w panelu po lewej w sekcji "Pamięć" wybierz "Pamięć lokalna" i znajdź na liście https://wykop.pl 5. w głównym okienku pojawi się lista kilku wartości. Znajdź opcję "wykopx/settings/settings" 6. zmień wybraną opcję na true (aby ją włączyć) lub false (aby wyłączyć) Domyślne wartości wyglądają przykładowo tak: {"entryVotersListExpandIfLessThan": 5, "votersFollow":true, "votersBlacklist":true, "votersBanned":true, "votersSuspended":true, "votersRemoved":true, "votersGenderF":false, "votersGenderM":false, "votersColorGreen":true, "votersColorOrange":false,"votersColorBurgundy":true} */ // DEFAULT SETTINGS - nie zmieniaj wartości settings w kodzie. // Zmień je w sposób opisany powyżej setSettingsValueFromCSSProperty("entryVotersListEnable"); // włącza pokazywanie listy plusujących z Wykop X Style setSettingsValueFromCSSProperty("entryVotersListExpandIfLessThan", 50, true); setSettingsValueFromCSSProperty("hideAds"); // blokuje wszystkie reklamy na wykopie // entryVotersListExpandIfLessThan - domyślnie Wykop pokazywał 5 osób, które zaplusowały. // Możesz zmienić tę wartość na np. 10 albo 25. Jeśli wpis ma mniej plusów niż ta liczba, zostaną od razu wyświetleni wszyscy plusujący bez przycisku "+15 INNYCH" settings.showAnimatedAvatars = true; // pokazuje animowane avatary if (settings.entryVotersListEnable) { // entryVotersListExpandIfLessThan - domyślnie Wykop pokazywał 5 osób, które zaplusowały. // Możesz zmienić tę wartość na np. 10 albo 25. Jeśli wpis ma mniej plusów niż ta liczba, zostaną od razu wyświetleni wszyscy plusujący bez przycisku "+15 INNYCH" if (!settings.entryVotersListExpandIfLessThan) settings.entryVotersListExpandIfLessThan = 20; settings.votersFollow = true; // pokazuje 🔔 przed użytkownikami, których obserwujesz settings.votersBlacklist = true; // pokazuje ⛔ przed użytkownikami, których blokujesz settings.votersBanned = true; // pokazuje użytkowników z aktywnym banem w kolorze i z ikonką 🍌 settings.votersSuspended = true; // pokazuje ✖ przed kontami, które są w trakcie usuwania settings.votersRemoved = true; // pokazuje ✖ przed kontami, które są usunięte settings.votersGenderF = false; // pokazuje różową kropkę przed kobietami settings.votersGenderM = false; // pokazuje niebieską kropkę przed mężczyznami settings.votersColorGreen = true; // pokazuje zielonki w kolorze settings.votersColorOrange = false; // pokazuje pomarańczowych użytkowników w kolorze settings.votersColorBurgundy = true; // pokazuje użytkowników bordo w kolorze settings.votersFollowFirst = true; // pokazuje użytkowników, których obserwujesz pierwszych na liście settings.votersBlackFirst = false; // pokazuje plusy od moderacji pierwsze na liście (konta typu @wykop, @m__b, @a__s itd.) settings.votersBurgundyFirst = false; // pokazuje użytkowników bordo pierwszych na liście settings.votersOrangeFirst = false; // pokazuje zielonki pierwszych na liście settings.votersGreenFirst = false; // pokazuje pomarańczki pierwszych na liście settings.votersBlacklistLast = false; // pokazuje użytkowników, których zablokowałeś na końcu listy settings.votersRemovedLast = false; // pokazuje usunięte konta na końcu listy settings.votersBannedLast = false; // pokazuje zbanowanych na końcu listy settings.votersSuspendedLast = false; // pokazuje konta w trakcie usuwania na końcu listy } settings.hideShareButton = true; // ukrywa przycisk "Udostępnij" settings.showFavouriteButton = true; // pokazuje przycisk "Dodaj do ulubionych" (samą gwiazdkę) settings.showFavouriteButtonLabel = true; // pokazuje oprócz gwiazdki także tekst "Ulubione" // settings.addCommentPlusWhenVotingOnEntry = false; // gdy plusujesz wpis, dodaje komentarz "+1" // settings.addCommentPlusWhenVotingOnComment = false; // gdy plusujesz komentarz, dodaje komentarz "+1" settings.mikroczatShowLeftMenuButton = false; settings.mikroczatShowLeftMenuLink = true; settings.mikroczatShowTopNavButton = true; settings.mikroczatOpenMikroczatOnMiddleClick = false; settings.mikroczatOpenMikroczatOnCTRLLeftClick = true; settings.mikroczatOpenMikroczatOnCTRLMiddleClick = true; (async function () { // LOCALSTORAGE const localStorageSettings = localforage.createInstance({ driver: localforage.LOCALSTORAGE, name: "wykopx", storeName: "settings", }); await localStorageSettings.getItem('settings').then(async (localSettings) => { if (localSettings) { mergeSettings(localSettings, settings); } else { localStorageSettings.setItem('settings', settings); } await localStorageSettings.setItem('settings', settings); }).catch((err) => { console.error('Error', err); }); function mergeSettings(localSettings, defaultSettings) { for (let key in defaultSettings) { if (key in localSettings) { settings[key] = localSettings[key]; } else if (!(key in localSettings)) { settings[key] = defaultSettings[key]; } } } function createNewNavBarButton(options) { let nav_ul; if (options.position == "left") nav_ul = document.querySelector("body header div.left nav.main ul"); else if (options.position == "center") nav_ul = document.querySelector("body header div.right nav aside"); // doodle else nav_ul = document.querySelector("body header div.right nav ul"); // brak na wersji mobilnej if (nav_ul) { let nav_ul_li; // ! = nav_ul.querySelector(`li.wykopx_${options.class}_li`); if (!nav_ul_li) { nav_ul_li = document.createElement("li"); if (options.data) nav_ul_li.setAttribute(options.data, null); if (options.hideWithoutXStyle == true) nav_ul_li.classList.add("wykopxs"); addWykopXSClassesToElement(nav_ul_li, options.class, "li") // class="wykopx_aaaaaa_li" let nav_ul_li_a = document.createElement("a"); nav_ul_li.dataset["v-6c2d0fdd"] = ""; nav_ul_li_a.dataset["v-6c2d0fdd"] = ""; if (options.url) nav_ul_li_a.setAttribute("href", options.url); if (options.href) nav_ul_li_a.setAttribute("href", options.href); if (options.target) nav_ul_li_a.setAttribute("target", options.target); if (options.title) nav_ul_li_a.setAttribute("title", options.title); if (options.data) nav_ul_li_a.setAttribute(options.data, null); nav_ul_li_a.classList.add("hybrid"); if (options.class) addWykopXSClassesToElement(nav_ul_li_a, options.class); let nav_ul_li_a_span = document.createElement("span"); nav_ul_li_a_span.innerHTML = options.text; nav_ul_li_a.appendChild(nav_ul_li_a_span); nav_ul_li.appendChild(nav_ul_li_a); if (options.insertAfter != null) { let section = nav_ul.querySelector(options.insertAfter); section.insertAdjacentElement('afterend', nav_ul_li); } else { nav_ul.appendChild(nav_ul_li); } } } } function createLeftMenuButtons(asideLeftPanel = null) { if (dev) console.log("createLeftMenuButtons(), asideLeftPanel: ", asideLeftPanel); if (!asideLeftPanel) { asideLeftPanel = document.querySelector("body > section > div.main-content > aside.left-panel"); } if (!asideLeftPanel) return; let aside_section_div_ul_li = document.createElement('li'); aside_section_div_ul_li.classList.add('mikroczat'); aside_section_div_ul_li.title = mikroczatButtonOpenTitle; aside_section_div_ul_li.innerHTML = ` <div class="popper-button"> <span> <span class="button"> <a href="https://wykop.pl/czat" target="_mikroczat" class="wykopx_open_mikroczat hybrid"> <span>${mikroczatButtonOpenLabel}</span> </a> </span> </span> </div>`; if (settings.mikroczatShowLeftMenuButton) { const aside_section_buttons_div_ul = asideLeftPanel.querySelector("section.buttons > div.content > ul"); if (aside_section_buttons_div_ul && !aside_section_buttons_div_ul.querySelector("li.mikroczat")) { let clone = aside_section_div_ul_li.cloneNode(true); aside_section_buttons_div_ul.appendChild(clone); } } if (settings.mikroczatShowLeftMenuLink) { const aside_section_links_div_ul = asideLeftPanel.querySelector("section.links > div.content > ul"); if (aside_section_links_div_ul && !aside_section_links_div_ul.querySelector("li.mikroczat")) { let clone = aside_section_div_ul_li.cloneNode(true); aside_section_links_div_ul.appendChild(clone); } } } function addWykopXSClassesToElement(element, inputClassOrArray, suffix = null) { if (inputClassOrArray) { if (typeof inputClassOrArray === 'string') { element.classList.add(`wykopx_${inputClassOrArray}${suffix != null ? "_" + suffix : ""}`); } else if (Array.isArray(inputClassOrArray) && inputClassOrArray.every(item => typeof item === 'string')) { inputClassOrArray.map(item => { element.classList.add(`wykopx_${item}${suffix != null ? "_" + suffix : ""}`); }); } } } // XS MIKROCZAT -- START let wykopDomain = "https://wykop.pl"; let wxDomain = "https://wykopx.pl"; const mikroczatDomain = "https://mikroczat.pl"; const mikroczatPath = "/"; /* /czat */ const mikroczatMainChannelPath = "czat"; const mikroczaDefaultChannel = "mikroblog+"; // let mikroczatChannel = "/"; let mikroczatWindow = null; const mikroczatButtonOpenTitle = `Wykopowy Mikroczat Otwieranie czatu w 𝗡𝗢𝗪𝗘𝗝 𝗞𝗔𝗥𝗖𝗜𝗘: - 𝗟𝗣𝗠 - klik lewym przyciskiem myszy Otwieranie czatu w 𝗡𝗢𝗪𝗬𝗠 𝗢𝗞𝗡𝗜𝗘: - ŚPM - klik środkowym przyciskiem myszy - klawisz ⌘ 𝗖𝗧𝗥𝗟 + klik - klawisz ⇧ 𝗦𝗛𝗜𝗙𝗧 + klik - klawisz ⎇ 𝗔𝗟𝗧 + klik EXTRA: - będąc na stronie #tagu otworzysz kanał tematyczny czatu - będąc na stronie wpisu otworzysz widok dyskusji - będąc na profilu użytkownika lub rozmowie otworzysz kanał prywatnej rozmowy `; const mikroczatButtonOpenLabel = "Czat"; // OTWIERANIE MIKROCZATU Z PRZYCISKÓW CZAT if (settings.mikroczatShowLeftMenuButton || settings.mikroczatShowLeftMenuLink || settings.mikroczatShowTopNavButton) { document.addEventListener("mousedown", (e) => { if (e.target.matches("a.wykopx_open_mikroczat") || e.target.matches("a.wykopx_open_mikroczat > span")) { e.preventDefault(); e.stopImmediatePropagation(); e.stopPropagation(); wykopx_open_mikroczat_event(e); } }); document.addEventListener("click", (e) => { if (e.target.matches("a.wykopx_open_mikroczat") || e.target.matches("a.wykopx_open_mikroczat > span")) { e.preventDefault(); } }); document.addEventListener("auxclick", (e) => { if (e.target.matches("a.wykopx_open_mikroczat") || e.target.matches("a.wykopx_open_mikroczat > span")) { e.preventDefault(); } }); document.addEventListener("mouseout", (e) => { if (e.target.matches("a.wykopx_open_mikroczat") && e.target.href != "https://wykop.pl/czat") { e.target.href = "https://wykop.pl/czat"; } }); document.addEventListener("contextmenu", (e) => { if (e.target.matches("a.wykopx_open_mikroczat")) { e.target.href = "https://mikroczat.pl"; } if (e.target.matches("a.wykopx_open_mikroczat > span")) { e.target.closest("a").href = "https://mikroczat.pl"; } }); } function wykopx_open_mikroczat_event(e) { if (e.target.matches("a.wykopx_open_mikroczat") || e.target.matches("a.wykopx_open_mikroczat > span")) { if (e.button === 2) return; // RIGHT MOUSE CLICK OFF let windowOptions = ""; if (e.shiftKey || e.ctrlKey || e.metaKey || e.altKey || e.button === 1) // ŚPM { windowOptions = "popup"; } openMikroczat(new URL(document.URL).pathname, windowOptions); } } function openMikroczat(hrefURL, windowOptions, target = "mikroczat") { let urlPathnameArray = hrefURL; let mikroczatURL = `${mikroczatDomain}`; if (hrefURL.startsWith("https://mikroczat.pl")) { mikroczatURL = hrefURL; } else { if (hrefURL.startsWith("https://wykop.pl")) { urlPathnameArray = hrefURL.replace("https://wykop.pl", ""); } urlPathnameArray = urlPathnameArray.split("/"); let channel = "" if (Array.isArray(urlPathnameArray)) { // #nazwatagu if (urlPathnameArray[1] == "tag") { channel = `${mikroczatMainChannelPath}/${urlPathnameArray[2]}`; } else if (urlPathnameArray[1] == "mikroblog") { if (urlPathnameArray[2] == "najnowsze") // /mikroblog/najnowsze { channel = `${mikroczatMainChannelPath}/mikroblog+`; } // TODO pathnameArray[2] == "aktywne" // TODO pathnameArray[2] == "gorace" else { channel = `${mikroczatMainChannelPath}/${mikroczaDefaultChannel}`; // TODO } } // /obserwowane else if (urlPathnameArray[1] == "obserwowane") { channel = `${mikroczatMainChannelPath}/observed`; // Mikroczat "observed" 🤍 // TODO pathnameArray[2] == "profile" // TODO pathnameArray[2] == "tagi" } // uzytkownik - profil lub rozmowa z użytkownikiem else if (urlPathnameArray[1] == "ludzie" || urlPathnameArray[1] == "wiadomosci") { channel = "pm/@" + urlPathnameArray[2]; } else if (urlPathnameArray[1] == "wpis") { channel = `${mikroczatMainChannelPath}/${mikroczaDefaultChannel}/#${urlPathnameArray[2]}`; // id wpisu - discussion view } else if (urlPathnameArray[1] == "") // ze strony głównej { channel = `${mikroczatMainChannelPath}/observed/#wybierz`; } else // z innych stron { channel = `${mikroczatMainChannelPath}/observed/#wybierz`; } } mikroczatURL += `${mikroczatPath}${channel}`; } clearKeysDatasetFromBody(); mikroczatWindow = window.open(mikroczatURL, target, windowOptions); } function clearKeysDatasetFromBody() { if (bodySection.dataset.key_shift) delete bodySection.dataset.key_shift; if (bodySection.dataset.key_ctrl) delete bodySection.dataset.key_ctrl; if (bodySection.dataset.key_alt) delete bodySection.dataset.key_alt; } const keys = {}; // KEYDOWN CTRL SHIFT ALT if (settings.mikroczatOpenMikroczatOnCTRLLeftClick || settings.mikroczatOpenMikroczatOnCTRLMiddleClick) { document.addEventListener("keydown", (e) => { if (e.target.tagName.toLowerCase() === 'textarea' || e.target.tagName.toLowerCase() === 'input') return; if (!keys["CTRL"] && e.key == "Control") { keys["CTRL"] = true; bodySection.dataset.key_ctrl = "true"; } // if (!keys["SHIFT"] && e.key == "Shift") // { // keys["SHIFT"] = true; // bodySection.dataset.key_shift = "true"; // } // if (!keys["ALT"] && (e.key == "Alt" || e.key == "AltGraph")) // { // keys["ALT"] = true; // bodySection.dataset.key_alt = "true"; // } }); document.addEventListener("keyup", (e) => { if (e.target.tagName.toLowerCase() === 'textarea' || e.target.tagName.toLowerCase() === 'input') return; // if (keys["SHIFT"] && e.key == "Shift") // { // keys["SHIFT"] = false; // delete bodySection.dataset.key_shift; // } if (keys["CTRL"] && e.key == "Control") { keys["CTRL"] = false; delete bodySection.dataset.key_ctrl; } // if (keys["ALT"] && (e.key == "Alt" || e.key == "AltGraph")) // { // keys["ALT"] = false; // delete bodySection.dataset.key_alt; // } }); } const performanceObserver = new PerformanceObserver((PerformanceObserverEntryList, PerformanceObserver) => { if (settings.mikroczatOpenMikroczatOnCTRLLeftClick || settings.mikroczatOpenMikroczatOnCTRLMiddleClick) { clearKeysDatasetFromBody(); } if (dev) console.log("PerformanceObserverEntryList", PerformanceObserverEntryList); if (dev) console.log("PerformanceObserverEntryList.getEntries", PerformanceObserverEntryList.getEntries()[0].name); /* { duration: 0 entryType: "soft-navigation", name: "https://wykop.pl/wpis/76597433/ponad-700-wykopow-glowna-i-poprawnosc-polityczna-m#268853079", navigationId: "229d696d-dc59-4874-a63b-fd753787d4fd", source: Window {0: Window, 1: global, 2: global, 3: global, 4: global, 5: global, 6: global, 7: global, 8: global, 9: global, 10: global, 11: global, 12: global, 13: Window, 14: global, window: Window, self: Window, document: document, name: '', location: Location, …} startTime: 82282.70000000298 } */ }); performanceObserver.observe({ type: "soft-navigation", buffered: true }); document.addEventListener("mouseover", (e) => { if (!e.target.matches(`a[href^="https://mikroczat.pl"]`)) return; e.target.title = `Otwórz wykopowy Mikroczat`; e.target.addEventListener("click", mikroczatHrefClickEventListenerPreventDefault); e.target.addEventListener("auxclick", mikroczatHrefClickEventListenerPreventDefault); e.target.addEventListener("mousedown", mikroczatHrefMouseDownEventListenerWithShift); }); document.addEventListener("mouseout", (e) => { if (!e.target.matches(`a[href^="https://mikroczat.pl"]`)) return; removeEventListenersFromMikroczatHref(e.target); }); function mikroczatHrefClickEventListenerPreventDefault(e) { e.preventDefault(); } function removeEventListeners(etarget) { etarget.removeEventListener("click", hrefClickEventListenerPreventDefault, true); etarget.removeEventListener("mousedown", hrefMouseDownEventListenerWithShift, true); } function removeEventListenersFromMikroczatHref(etarget) { etarget.removeEventListener("click", mikroczatHrefClickEventListenerPreventDefault, true); etarget.removeEventListener("auxclick", mikroczatHrefClickEventListenerPreventDefault, true); etarget.removeEventListener("mousedown", mikroczatHrefMouseDownEventListenerWithShift, true); } // MOUSE OVER LINKS if (settings.mikroczatOpenMikroczatOnCTRLLeftClick || settings.mikroczatOpenMikroczatOnCTRLMiddleClick || settings.mikroczatOpenMikroczatOnMiddleClick) { document.addEventListener("mouseover", (e) => { if (!e.target.matches(`a[href^="/tag/"]`) && !e.target.matches(`a[href^="/ludzie/"]`) // && !e.target.matches(`a.username[href^="/ludzie/"] > span`) //&& !e.target.matches(`a[href^="/ludzie/"]:not(:has(> span))`) && !e.target.matches(`a[href^="/wpis/"] > time`)) return; // ⇧ 𝗦𝗛𝗜𝗙𝗧 // ⌘ 𝗖𝗧𝗥𝗟 // ⎇ 𝗔𝗟𝗧 // #heheszki if (e.target.matches(`a[href^="/tag/"]`)) { e.target.addEventListener("click", hrefClickEventListenerPreventDefault); e.target.addEventListener("auxclick", hrefClickEventListenerPreventDefault); e.target.addEventListener("mousedown", hrefMouseDownEventListenerWithShift); // e.target.addEventListener("mouseup", hrefMouseUpEventListenerWithShift, true); e.target.title = `Klikając w tag wciśnij klawisz 𝗖𝗧𝗥𝗟, lub kliknij w tag śordkowym przyciskiem myszy, żeby otworzyć na 🗯 𝗠𝗶𝗸𝗿𝗼𝗰𝘇𝗮𝗰𝗶𝗲 kanał tematyczny Kanał tematyczny #${e.target.innerText}: ⌘ 𝗖𝗧𝗥𝗟 + kliknięcie LPM - w nowej karcie ⌘ 𝗖𝗧𝗥𝗟 + kliknięcie ŚPM - w nowym oknie `; } // @NadiaFrance else if (e.target.matches(`a[href^="/ludzie/"]`)) { e.target.addEventListener("click", hrefClickEventListenerPreventDefault); e.target.addEventListener("auxclick", hrefClickEventListenerPreventDefault); e.target.addEventListener("mousedown", hrefMouseDownEventListenerWithShift); // e.target.addEventListener("mouseup", hrefMouseUpEventListenerWithShift, true); e.target.title = `Wciśnij klawisz 𝗖𝗧𝗥𝗟 klikając w login użytkownika, aby otworzyć rozmowę prywatną (PM) na 🗯 Mikroczacie Rozmowa prywatna: ⌘ 𝗖𝗧𝗥𝗟 + kliknięcie LPM - w nowej karcie ⌘ 𝗖𝗧𝗥𝗟 + kliknięcie ŚPM - w nowym oknie `; } // PERMALINK DO WPISU else if (e.target.matches(`a[href^="/wpis/"] > time`)) { e.target.addEventListener("click", hrefClickEventListenerPreventDefault); e.target.addEventListener("auxclick", hrefClickEventListenerPreventDefault); e.target.addEventListener("mousedown", hrefMouseDownEventListenerWithShift); // e.target.addEventListener("mouseup", hrefMouseUpEventListenerWithShift, true); const dateObj = dayjs(e.target.dateTime); const dateFull = dateObj.format('D MMMM YYYY'); const timeFull = dateObj.format('HH:mm:ss'); const dateDayOfWeek = dateObj.format('dddd'); const daysAgo = dateObj.fromNow(); e.target.title = `Dodany: ⌚ ${daysAgo}, ${timeFull} 📅 ${dateDayOfWeek}, ${dateFull} r. Klikając w datę wpisu/komentarza wciśnij klawisz 𝗖𝗧𝗥𝗟 lub kliknij datę środkowym przyciskiem myszy, żeby otworzyć całą dyskusję ze wszystkimi komentarzami na 🗯 𝗠𝗶𝗸𝗿𝗼𝗰𝘇𝗮𝗰𝗶𝗲 Widok dyskusji: ⌘ 𝗖𝗧𝗥𝗟 + kliknięcie LPM - w nowej karcie ⌘ 𝗖𝗧𝗥𝗟 + kliknięcie ŚPM - w nowym oknie `; } }); // MOUSE OUT document.addEventListener("mouseout", (e) => { if (e.target.matches(`a[href^="/tag/"]`) || e.target.matches(`a[href^="/ludzie/"]`) || e.target.matches(`a[href^="/wpis/"] > time`)) { removeEventListeners(e.target); } }); } // CLICK EVENT function hrefClickEventListenerPreventDefault(e) { // ŚPM if (settings.mikroczatOpenMikroczatOnMiddleClick) { if (e.button === 1 && !e.shiftKey && !e.altKey && !e.ctrlKey && !e.metaKey) { e.preventDefault(); } } // ŚPM + CTRL if (settings.mikroczatOpenMikroczatOnCTRLMiddleClick) { if (e.button === 1 && !e.shiftKey && !e.altKey && (e.ctrlKey || e.metaKey)) { e.preventDefault(); } } // LPM + CTRL if (settings.mikroczatOpenMikroczatOnCTRLLeftClick) { if (e.button === 0 && !e.shiftKey && !e.altKey && (e.ctrlKey || e.metaKey)) { e.preventDefault(); } } } function mikroczatHrefMouseDownEventListenerWithShift(e) { // new window if (e.button === 1 // ŚPM || (e.button === 0 && !e.shiftKey && !e.altKey && (e.ctrlKey || e.metaKey)) // LPM + CTRL ) { e.preventDefault(); e.stopImmediatePropagation(); e.stopPropagation(); let ahrefElement = e.target; if (e.target.tagName != "A") ahrefElement = e.target.closest("a"); // <a><span> openMikroczat(ahrefElement.href, "popup"); // new window popup } // LPM else if (e.button === 0) { e.preventDefault(); e.stopImmediatePropagation(); e.stopPropagation(); let ahrefElement = e.target; openMikroczat(ahrefElement.href, null, "_blank"); // new tab } } // MOUSE DOWN function hrefMouseDownEventListenerWithShift(e) { // ŚPM if (settings.mikroczatOpenMikroczatOnMiddleClick) { if (e.button === 1 && !e.shiftKey && !e.altKey && !e.ctrlKey && !e.metaKey) { e.preventDefault(); e.stopImmediatePropagation(); e.stopPropagation(); let ahrefElement = e.target; if (e.target.tagName != "A") ahrefElement = e.target.closest("a"); // <a><time> openMikroczat(ahrefElement.href, null, "_blank"); // new tab } } // ŚPM + CTRL if (settings.mikroczatOpenMikroczatOnCTRLMiddleClick) { if (e.button === 1 && !e.shiftKey && !e.altKey && (e.ctrlKey || e.metaKey)) { e.preventDefault(); e.stopImmediatePropagation(); e.stopPropagation(); let ahrefElement = e.target; if (e.target.tagName != "A") ahrefElement = e.target.closest("a"); // <a><time> openMikroczat(ahrefElement.href, "popup"); // new window popup } } // LPM + CTRL if (settings.mikroczatOpenMikroczatOnCTRLLeftClick) { if (e.button === 0 && !e.shiftKey && !e.altKey && (e.ctrlKey || e.metaKey)) { e.preventDefault(); e.stopImmediatePropagation(); e.stopPropagation(); let ahrefElement = e.target; if (e.target.tagName != "A") ahrefElement = e.target.closest("a"); // <a><time> openMikroczat(ahrefElement.href, null, "_blank"); // new tab } } } // WIADOMOŚCI OD MIKROCZAT.PL window.addEventListener('message', function (event) { if (event.origin !== mikroczatDomain) return; if (dev) console.log('Wiadomość z mikroczat.pl', event.data); //if (event.data == "MikroCzatOpened") mikroczatWindow.postMessage({ type: "token", token: window.localStorage.getItem("token") }, mikroczatDomain); if (event.data == "MikroCzatOpened") { mikroczatWindow.postMessage({ type: "TokensObject", userKeep: window.localStorage.getItem("userKeep") }, mikroczatDomain); // mikroczatWindow.postMessage({ type: "TokensObject", token: window.localStorage.getItem("token"), userKeep: window.localStorage.getItem("userKeep") }, mikroczatDomain); } if (event.data == "MikroCzatLoggedIn") { if (dev) console.log("event.data", event.data) bodySection.dataset.mikroczatLogged = true; } if (event.data == "MikroCzatClosed") { bodySection.dataset.mikroczatLogged = false; mikroczatWindow = null; } }, false); // CSS { CSS += ` /* LEFT MENU MIKROCZAT BUTTON - START */ body aside.left-panel > section.links > div.content > ul > li { position: relative; transition: none; } body aside.left-panel:not(.mini):has(section.buttons > div.content > ul > li.mikroczat) > section.links > div.content > ul > li.mikroczat { display: none; } body aside.left-panel > section.links > div.content > ul > li a.hybrid[class] /* [data-v-5687662b] */ { padding: 0 6px; display: block; -webkit-box-sizing: border-box; box-sizing: border-box; font-weight: 400; text-decoration: none; font-size: 16px; line-height: 36px; height: 36px; cursor: pointer; transition: none; } body aside.left-panel > section.links > div.content > ul > li a.hybrid[class]:before /* [data-v-5687662b] */ { content: ''; display: block; position: absolute; -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat; -webkit-mask-position: center; mask-position: center; -webkit-mask-size: cover; mask-size: cover; background: var(--gullGray); top: 50%; left: 24px; z-index: 1; transition: none; } body aside.left-panel > section.links > div.content > ul > li.mikroczat a.hybrid[class]:before { -webkit-mask-image: url(https://i.imgur.com/82a9CyK.png); mask-image: url(https://i.imgur.com/82a9CyK.png); -webkit-mask-size: 22px 22px; mask-size: 22px 22px; width: 22px; height: 22px; margin-top: 0px; transition: none; } body aside.left-panel > section.links > div.content > ul > li.mikroczat a.hybrid[class]:before { top: 7px; left: 13px; } body aside.left-panel > section.links > div.content > ul > li a > span { display: block; padding: 0 16px 0 38px; border-radius: 6px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; position: relative; /* em */ font-style: normal; color: var(--steelBluish); transition: none; position: relative; } body aside.left-panel > section.links > div.content > ul > li:hover a > span { background: var(--squeeze); cursor: pointer; } body aside.left-panel.mini > section.links > div.content > ul > li.mikroczat a > span { font-size: 0; } `; //if (settings.mikroczatShowLeftMenuButton) { CSS += ` /* 4 BUTTONS */ body aside.left-panel:not(.mini) > section.buttons > div.content > ul:has(li.mikroczat) { display: flex; flex-wrap: wrap; justify-content: space-around; column-gap: 0px; } body aside.left-panel:not(.mini) > section.buttons > div.content > ul > li { flex-basis: 47%; box-sizing: border-box; padding: 0px; margin-top: 7px; } body aside.left-panel > section > div.content > ul > li { position: relative; cursor: pointer; } body aside.left-panel.mini > section > div.content > ul > li:hover, body aside.left-panel:not(.mini) > section.buttons > div.content > ul > li:hover a::before { background: var(--squeeze); } aside.left-panel>section.buttons>.content ul li a /* [data-v-5687662b] */ { display: block; position: relative; color: var(--steelBluish); font-size: 0; } aside.left-panel>section.buttons>.content ul li.active a, /* [data-v-5687662b] */ aside.left-panel>section.buttons>.content ul li:hover a /* [data-v-5687662b] */ { color: var(--tuna); font-weight: 600; } aside.left-panel>section.buttons>.content ul li a:before /* [data-v-5687662b] */ { content: ''; display: block; width: 100%; height: 36px; border: 1px solid var(--porcelain); border-radius: 6px; box-sizing: border-box; transition: background .2s ease, border .2s ease; } [data-night-mode] aside.left-panel>section.buttons>.content ul li a:before /* [data-v-5687662b] */ { border-color: #303032; } aside.left-panel:not(.mini)>section.buttons>.content ul li:hover a:before, [data-night-mode] aside.left-panel:not(.mini)>section.buttons>.content ul li:hover a:before { border-color: var(--tuna); } aside.left-panel:not(.mini)>section.buttons>.content ul li a:after /* [data-v-5687662b] */ { content: ''; display: block; position: absolute; -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat; -webkit-mask-position: center; mask-position: center; background: var(--gullGray); height: 34px; width: 100%; top: 0; left: 0; -webkit-transition: background .2s ease; transition: background .2s ease; } aside.left-panel:not(.mini)>section.buttons>.content ul li.mikroczat a:after /* [data-v-5687662b] */ { -webkit-mask-image: url(https://i.imgur.com/82a9CyK.png); mask-image: url(https://i.imgur.com/82a9CyK.png); -webkit-mask-size: 22px 22px; mask-size: 22px 22px; } aside.left-panel:not(.mini)>section.buttons>.content ul li a>span /*[data-v-5687662b] */ { position: relative; display: inline-block; font-size: 11px; left: 50%; -webkit-transform: translateX(-50%); transform: translateX(-50%); white-space: nowrap; margin-top: 2px; line-height: 16px; height: 16px; }`; /* LEFT MENU MIKROCZAT BUTTON - END */ } /* MIKROCZAT TAG LINKS */ CSS += ` section:is(.entry-content, .link-block)[class] { overflow: visible!important; } section:is(.entry-content, .link-block) a[href^="/tag/"] { padding-right: 2px !important; margin-right: 1px; transition: none!important; } section:is(.entry-content, .link-block) a[href^="https://mikroczat.pl/"] { padding-right: 2px!important; padding-left: 2px!important; } section.sidebar a[href^="/tag/"], section:is(.entry-content, .link-block) a[href^="/tag/"], section.entry div.right a[href^="/wpis/"], section.entry-content a[href^="/ludzie/"], section.entry div.right a.username[href^="/ludzie/"], section.link-block a.username[href^="/ludzie/"], section.entry-content .wrapper a[href^="https://mikroczat.pl/"] { border: 1px solid transparent!important; position: relative!important; cursor: pointer!important; transition: none!important; } body > section[data-key_ctrl="true"] section.sidebar a[href^="/tag/"], body > section[data-key_ctrl="true"] section:is(.entry-content, .link-block) a[href^="/tag/"], body > section[data-key_ctrl="true"] section:is(.entry-content, .link-block) a[href^="/tag/"] *, body > section[data-key_ctrl="true"] section.entry div.right a[href^="/wpis/"] *, body > section[data-key_ctrl="true"] section.entry-content a[href^="https://mikroczat.pl/"], body > section[data-key_ctrl="true"] section.entry-content a[href^="https://mikroczat.pl/"] * { color: var(--tagChannelColor)!important; } body > section[data-key_ctrl="true"] section.sidebar a[href^="/tag/"], body > section[data-key_ctrl="true"] section:is(.entry-content, .link-block) a[href^="/tag/"], body > section[data-key_ctrl="true"] section.entry div.right a[href^="/wpis/"], body > section[data-key_ctrl="true"] section.entry-content a[href^="https://mikroczat.pl/"] { border-color: var(--tagChannelColor)!important; background-color: color-mix(in srgb, var(--whitish) 90%, var(--tagChannelColor))!important; border-radius: var(--smallBorderRadius)!important; } body > section[data-key_ctrl="true"] section.sidebar a[href^="/tag/"]:hover, body > section[data-key_ctrl="true"] section:is(.entry-content, .link-block) a[href^="/tag/"]:hover, body > section[data-key_ctrl="true"] section.entry div.right a[href^="/wpis/"]:hover, body > section[data-key_ctrl="true"] section.entry-content a[href^="https://mikroczat.pl/"]:hover { background-color: color-mix(in srgb, var(--whitish) 60%, var(--tagChannelColor))!important; } body > section[data-key_ctrl="true"] section.sidebar a[href^="/tag/"], body > section[data-key_ctrl="true"] section:is(.entry-content, .link-block) a[href^="/tag/"], body > section[data-key_ctrl="true"] section.entry-content a[href^="/ludzie/"], body > section[data-key_ctrl="true"] section.link-block a.username[href^="/ludzie/"] { padding-left: 3px !important; margin-left: -12px !important; } body > section[data-key_ctrl="true"] section.sidebar a[href^="/tag/"]:hover, body > section[data-key_ctrl="true"] section:is(.entry-content, .link-block) a[href^="/tag/"]:hover, body > section[data-key_ctrl="true"] section.entry div.right a[href^="/wpis/"]:hover, body > section[data-key_ctrl="true"] section:is(.entry-content, .link-block) a[href^="/ludzie/"]:hover { text-decoration: none!important; } body > section[data-key_ctrl="true"] section.sidebar a[href^="/tag/"]::before, body > section[data-key_ctrl="true"] section:is(.entry-content, .link-block) a[href^="/tag/"]::before { content: "#"; } body > section[data-key_ctrl="true"] section.entry-content a[href^="/ludzie/"], body > section[data-key_ctrl="true"] section.entry div.right a.username[href^="/ludzie/"], body > section[data-key_ctrl="true"] section.link-block a.username[href^="/ludzie/"], body > section[data-key_ctrl="true"] section.entry-content a[href^="https://mikroczat.pl/pm/"], body > section[data-key_ctrl="true"] section.entry-content a[href^="https://mikroczat.pl/room/"] { color: var(--pmChannelColor)!important; border-color: var(--pmChannelColor)!important; background-color: color-mix(in srgb, var(--whitish) 90%, var(--pmChannelColor))!important; padding: 0px 3px; margin-left: 3px; } body > section[data-key_ctrl="true"] section.entry-content a[href^="/ludzie/"]:hover, body > section[data-key_ctrl="true"] section.entry div.right a.username[href^="/ludzie/"]:hover, body > section[data-key_ctrl="true"] section.link-block a.username[href^="/ludzie/"]:hover, body > section[data-key_ctrl="true"] section.entry-content a[href^="https://mikroczat.pl/pm/"]:hover, body > section[data-key_ctrl="true"] section.entry-content a[href^="https://mikroczat.pl/room/"]:hover { background-color: color-mix(in srgb, var(--whitish) 60%, var(--pmChannelColor))!important; } body > section[data-key_ctrl="true"] section.entry-content a[href^="/ludzie/"]::before, body > section[data-key_ctrl="true"] section.entry div.right a.username[href^="/ludzie/"]::before, body > section[data-key_ctrl="true"] section.link-block a.username[href^="/ludzie/"]::before { content: ""; } `; // /* // body > section[data-key_ctrl="true"] section.entry-content a[href^="/tag/"]::after, // body > section[data-key_ctrl="true"] section.entry-content a[href^="/ludzie/"]::after, // body > section[data-key_ctrl="true"] section.entry div.right a.username[href^="/ludzie/"]::after, // body > section[data-key_ctrl="true"] section.entry-content a[href^="https://mikroczat.pl/"]::after // { // color: white; // content: "🗯"; // position: absolute; // top: -1em; // right: -0.5em; // } // */ CSS += ` /* TOP NAV CZAT BUTTON */ body > section.open-left-panel > header.header > div.left > nav.main > ul > li.wykopx_open_mikroczat_li { display: none; } /*body > section[data-mikroczat-logged="true"] li.wykopx_open_mikroczat_li span:after { content: "•"; color: white; position: absolute; top: 4px; right: 5px; }*/ body > section[data-mikroczat-logged="false"] li.wykopx_open_mikroczat_li span:after { content: "•"; color: rgb(255, 255, 255, 0.3); position: absolute; top: 4px; right: 5px; }`; } function throttle(func, delay) { let promise = Promise.resolve(); return function (...args) { promise = promise.then(() => { return new Promise((resolve) => { setTimeout(() => { func(...args); resolve(); }, delay); }); }); }; } const throttledAddVotersList = throttle(addVotersList, 200); let observer = new MutationObserver((mutations) => { console.log(`--- ${mutations.length} mutations`, mutations); mutations.forEach((mutation) => { if (dev || true) { console.log("---------- new mutation -----"); console.log(mutation); if (mutation.type) { console.log(`⭐ mutation.type: `, mutation.type) } if (mutation.attributeName) { console.log(`⭐ mutation.attributeName: ${mutation.attributeName}`, mutation.attributeName) } if (mutation.addedNodes.length > 0 && mutation.addedNodes[0] && mutation.addedNodes[0] instanceof Element) { console.log(`⭐ mutation.addedNodes.length: ${mutation.addedNodes.length}`, mutation.addedNodes[0]) } if (mutation.target) { console.log(`⭐ mutation.target: ${mutation.target.tagName}`, mutation.target) if (mutation.target.tagName === "SECTION") { } } } // ADDED NODES if (mutation.addedNodes.length > 0 && mutation.addedNodes[0] && mutation.addedNodes[0].nodeType === Node.ELEMENT_NODE) // && mutation.addedNodes[0] instanceof Element) { if (mutation.addedNodes[0].matches("section.entry[id]") && mutation.addedNodes[0].__vue__?.item?.resource != "link_comment") { const sectionEntry = mutation.addedNodes[0]; if (dev) console.log("mutation 1", sectionEntry); processSectionEntry(sectionEntry) const sectionCommentsArray = sectionEntry.querySelectorAll("section.entry[id]"); if (dev) console.log("mutation 1 - forEach: sectionEntryArray", sectionCommentsArray); sectionCommentsArray.forEach((sectionComment) => { if (sectionComment.__vue__?.item?.resource != "link_comment") { processSectionEntry(sectionComment) } }); } else if (mutation.addedNodes[0].matches("div.content:has(>section.entry[id])")) { const sectionEntriesArray = mutation.addedNodes[0].querySelectorAll("section.entry[id]"); if (dev) console.log("mutation 2 - forEach: sectionEntriesArray", sectionEntriesArray); sectionEntriesArray.forEach((sectionEntry) => { if (sectionEntry.__vue__?.item?.resource != "link_comment") { processSectionEntry(sectionEntry) } }) } else if (mutation.target.tagName === "SECTION" && mutation.target.matches("section.entry.detailed[id]")) { const sectionEntry = mutation.target; if (dev) console.log("mutation 3", sectionEntry) if (dev) console.log("mutation 3: mutation.target", mutation.target); if (sectionEntry.__vue__?.item?.resource != "link_comment") { processSectionEntry(sectionEntry) } const sectionCommentsArray = sectionEntry.querySelectorAll("section.entry[id]"); if (dev) console.log("mutation 3 - forEach: sectionEntryArray", sectionCommentsArray); sectionCommentsArray.forEach((sectionComment) => { if (sectionComment.__vue__?.item?.resource != "link_comment") { processSectionEntry(sectionComment) } }); } else if (settings.showAnimatedAvatars && mutation.addedNodes[0].matches("aside.profile-top")) { animatedAvatar(mutation.addedNodes[0]); } // LEFT SIDE CATEGORY MENU OPENED else if ((settings.mikroczatShowLeftMenuButton || settings.mikroczatShowLeftMenuLink) && mutation.addedNodes[0]?.matches("section.links")) { createLeftMenuButtons(); } } else if (mutation.removedNodes.length > 0 && mutation.removedNodes[0] && mutation.removedNodes[0].nodeType === Node.ELEMENT_NODE) { // LEFT SIDE CATEGORY MENU CLOSED if ((settings.mikroczatShowLeftMenuButton || settings.mikroczatShowLeftMenuLink) && mutation.removedNodes[0]?.nodeType === Node.ELEMENT_NODE && mutation.removedNodes[0]?.matches("section.links")) { createLeftMenuButtons(); } } }); }); if (settings.mikroczatShowLeftMenuButton || settings.mikroczatShowLeftMenuLink) { createLeftMenuButtons(); } if (settings.mikroczatShowTopNavButton) { createNewNavBarButton({ position: "left", // text: "Mikro<strong>czat</strong>", text: mikroczatButtonOpenLabel, title: mikroczatButtonOpenTitle, class: "open_mikroczat", // wykopx_open_mikroczat_li hideWithoutXStyle: false, //url: mikroczatDomain, url: "https://wykop.pl/czat", target: "_mikroczat", number: null, }); } // CONTENT LOADED let mainSection; document.addEventListener('readystatechange', (event) => { if (dev) console.log('readyState:' + document.readyState); mainSection = document.querySelector('body > section'); if (mainSection) { const sectionEntryArray = mainSection.querySelectorAll("section.entry[id]"); // if (dev) console.log("sectionEntryArray", sectionEntryArray); sectionEntryArray.forEach((sectionEntry) => { if (sectionEntry.__vue__?.item?.resource != "link_comment") { processSectionEntry(sectionEntry) } }) const config = { childList: true, subtree: true, }; observer.observe(mainSection, config); if (settings.showAnimatedAvatars) { const asideProfileTop = mainSection.querySelector("aside.profile-top"); if (asideProfileTop) animatedAvatar(asideProfileTop); } } }); function processSectionEntry(sectionEntry) { if (dev) console.log("processSectionEntry()", sectionEntry) if (!sectionEntry) return; if (settings.showAnimatedAvatars) animatedAvatar(sectionEntry); if (settings.showFavouriteButton) addFavouriteButton(sectionEntry); if (settings.entryVotersListEnable && sectionEntry?.__vue__?.item) { if (dev) console.log("sectionEntry?.__vue__.item.id", sectionEntry?.__vue__.item.id); if (dev) console.log("sectionEntry.dataset?.votersLoaded", sectionEntry.dataset?.votersLoaded); if (sectionEntry.dataset?.votersLoaded == sectionEntry?.__vue__.item.id) return; if (sectionEntry?.__vue__.item.votes.up == 0) { removeVotersListWhenNoVoters(sectionEntry); return; } if (settings.entryVotersListExpandIfLessThan > 5 && sectionEntry?.__vue__.item.votes.up <= settings.entryVotersListExpandIfLessThan && sectionEntry?.__vue__.item.votes.up > 5) { if (dev) console.log(`processSectionEntry() wybrano 💛throttledAddVotersList ${sectionEntry.__vue__.item.id} | plusow: ${sectionEntry.__vue__.item.votes.up}`,) throttledAddVotersList(sectionEntry); } else { if (dev) console.log(`processSectionEntry() wybrano 🤎addVotersList ${sectionEntry.__vue__.item.id} | plusow: ${sectionEntry.__vue__.item.votes.up}`,) addVotersList(sectionEntry) } } } function animatedAvatar(sectionEntry) { const image = sectionEntry.querySelector('a.avatar figure img'); // Replace with your actual selector if (image) { const currentSrc = image.getAttribute('src'); if (currentSrc.endsWith('.gif')) { const modifiedSrc = currentSrc.replace(/,.*?\./, '.'); image.setAttribute('src', modifiedSrc); } } } function removeVotersListWhenNoVoters(sectionEntry) { if (sectionEntry) { delete sectionEntry.dataset?.votersLoaded; sectionEntry.querySelector("section.entry-voters")?.remove(); } } async function addVotersList(sectionEntry) { if (!sectionEntry || !sectionEntry.__vue__) return; if (sectionEntry.dataset?.votersLoaded == sectionEntry?.__vue__.item.id) return; if (sectionEntry?.__vue__ && sectionEntry?.__vue__.item.votes.up > 0) { if (sectionEntry?.__vue__ && settings.entryVotersListExpandIfLessThan > 5 && sectionEntry?.__vue__.item.votes.up <= settings.entryVotersListExpandIfLessThan && sectionEntry?.__vue__.item.votes.up > 5) { let entryId, commentId; if (sectionEntry?.__vue__?.item.resource == "entry") { entryId = sectionEntry?.__vue__?.item.id; } else if (sectionEntry?.__vue__?.item.resource == "entry_comment") { entryId = sectionEntry?.__vue__?.item.parent.id; commentId = sectionEntry?.__vue__?.item.id; } let voters = await fetchAllVotersFromAPI(entryId, commentId); appendVotersToEntry(sectionEntry, voters); } else { appendVotersToEntry(sectionEntry, sectionEntry?.__vue__?.item?.votes?.users); } } } function addFavouriteButton(sectionEntry) { if (sectionEntry && sectionEntry?.__vue__) { const sectionActionsUL = sectionEntry.querySelector("section.actions:not(:has(li.favourite)) > ul"); if (!sectionActionsUL) return; let entryId, commentId; let isFavourite = sectionEntry?.__vue__?.item.favourite; if (sectionEntry?.__vue__?.item.resource == "entry") { entryId = sectionEntry?.__vue__?.item.id; } else if (sectionEntry?.__vue__?.item.resource == "entry_comment") { entryId = sectionEntry?.__vue__?.item.parent.id; commentId = sectionEntry?.__vue__?.item.id; } const favButtonLI = document.createElement("li"); favButtonLI.classList.add("favourite", "icon", "icon-favourite"); if (isFavourite) { favButtonLI.classList.add("active"); } const favButtonSpan = document.createElement("span"); favButtonSpan.classList.add("favouriteButton"); // VUE SENSITIVE /* data-v-90179052 */ favButtonLI.setAttribute('data-v-90179052', ''); favButtonSpan.setAttribute('data-v-90179052', ''); favButtonSpan.dataset.isFavourite = isFavourite; favButtonSpan.dataset.entryId = entryId; if (commentId) favButtonSpan.dataset.commentId = commentId; if (settings.showFavouriteButtonLabel) favButtonSpan.innerText = `Ulubione`; favButtonLI.appendChild(favButtonSpan); const sharingElement = sectionActionsUL.querySelector(".sharing"); if (sharingElement) sharingElement.insertAdjacentElement("afterend", favButtonLI); } } function appendVotersToEntry(sectionEntry, voters) { if (!sectionEntry) return; const divEditWrapperElement = sectionEntry.querySelector('article > div.edit-wrapper'); if (!divEditWrapperElement) return; sectionEntry.dataset.votersLoaded = sectionEntry?.__vue__?.item.id; const fiveVoters = voters; if (!fiveVoters || fiveVoters.length < 1) return false; let sectionEntryVotersHTML = `<ul>`; fiveVoters.forEach(voter => { sectionEntryVotersHTML += getListItemForUser(voter); }); // <li class="more"> if (sectionEntry?.__vue__?.item?.votes.up > settings.entryVotersListExpandIfLessThan && voters.length <= settings.entryVotersListExpandIfLessThan) { sectionEntryVotersHTML += ` <li data-no-bubble="" class="more"> <span data-votes-up="${sectionEntry?.__vue__?.item?.votes.up}"`; if (sectionEntry?.__vue__?.item.resource == "entry") { sectionEntryVotersHTML += `data-entry-id="${sectionEntry?.__vue__?.item.id}"`; } else if (sectionEntry?.__vue__?.item.resource == "entry_comment") { sectionEntryVotersHTML += `data-entry-id="${sectionEntry?.__vue__?.item.parent.id}"`; sectionEntryVotersHTML += `data-comment-id="${sectionEntry?.__vue__?.item.id}"`; } sectionEntryVotersHTML += `>+${sectionEntry?.__vue__?.item?.votes.up - 5} innych</span></li>`; } sectionEntryVotersHTML += `</ul>`; const sectionEntryVoters = document.createElement("section"); sectionEntryVoters.classList.add("entry-voters"); sectionEntryVoters.innerHTML = sectionEntryVotersHTML; const sectionEntryVotersElement = divEditWrapperElement.querySelector('section.entry-voters'); if (sectionEntryVotersElement) { let parentElement = sectionEntryVotersElement.parentNode; parentElement.replaceChild(sectionEntryVoters, sectionEntryVotersElement); } else { const editWrapper = sectionEntry.querySelector(".edit-wrapper"); if (editWrapper) editWrapper.appendChild(sectionEntryVoters); } } function getListItemForUser(voter) { let userHTML = `<li> <a href="/ludzie/${voter.username}" class="username`; userHTML += ` ${voter.color}-profile`; // orange-profile green-profile burgundy-profile userHTML += ` ${voter.status}`; // active banned suspended removed userHTML += ` follow-${voter.follow}`; // follow-true follow-false userHTML += ` verified-${voter.verified}`; // verified-false userHTML += ` blacklist-${voter.blacklist}`;// blacklist-true blacklist-false userHTML += ` online-${voter.online}`; // online-true online-false userHTML += ` ${voter.gender}-gender`; // m-gender, f-gender, null-gender if (voter.gender == "m") userHTML += ` male`; else if (voter.gender == "f") userHTML += ` female`; userHTML += `">`; if (settings?.votersFollow && voter.follow) userHTML += `<i class="follow-true" title="Obserwujesz tego użytkownika"></i>`; if (settings?.votersVerified && voter.verified) userHTML += `<i class="verified-true" title="Ten użytkownik jest zweryfikowany"></i>`; if (settings?.votersBlacklist && voter.blacklist) userHTML += `<i class="blacklist-true" title="Ten użytkownik jest na Twojej czarnej liście"></i>`; if (settings?.votersOffline && !voter.online) userHTML += `<i class="online-false" title="Ten uzytkownik jest teraz offline"></i>`; if (settings?.votersOnline && voter.online) userHTML += `<i class="online-true" title="Ten uzytkownik jest teraz online"></i>`; if (settings?.votersBanned && voter.status == "banned") userHTML += `<i class="banned" title="Użytkownik dostał bana. Z dodatkiem Wykop XS - Ban Info możesz szybko sprawdzić przyczynę i długość trwania bana."></i>`; if (settings?.votersSuspended && voter.status == "suspended") userHTML += `<i class="suspended" title="To konto jest w trakcie usuwania."></i>`; if (settings?.votersRemoved && voter.status == "removed") userHTML += `<i class="removed" title="Konto usunięte"></i>`; if (settings?.votersGenderM && voter.gender == "m") userHTML += `<i class="${voter.gender}-gender" title="Wpis od niebieskiego"></i>`; if (settings?.votersGenderF && voter.gender == "f") userHTML += `<i class="${voter.gender}-gender" title="Plus od różowej"></i>`; userHTML += `<span>${voter.username}</span> </a> </li>`; return userHTML; } /* <section data-v-6e6ed6ee="" data-v-2aacfeb5="" class="entry-voters"> <ul data-v-6e6ed6ee=""> <li data-v-6e6ed6ee="" class=""> <a data-v-ed9f6c56="" data-v-6e6ed6ee="" href="/ludzie/NaczelnyAgnostyk" class="username orange-profile active"> <span data-v-ed9f6c56=""> NaczelnyAgnostyk<!----> </span> </a> </li> <li data-v-6e6ed6ee="" data-no-bubble="" class="more"> <span data-v-6e6ed6ee="">+5 innych</span> </li> </ul> </section> */ function fetchAllVotersFromAPI(entryId, commentId) { if (dev) console.log(`fetchAllVotersFromAPI: ${entryId}, ${commentId}`) let apiURL = `https://wykop.pl/api/v3/entries/${entryId}/votes?page=1` if (commentId) apiURL = `https://wykop.pl/api/v3/entries/${entryId}/comments/${commentId}/votes`; return new Promise(async (resolve, reject) => { await fetch(apiURL, { method: "GET", headers: { "Content-Type": "application/json", Authorization: "Bearer " + window.localStorage.getItem("token"), }, }) .then((response) => { if (!response.ok) { if (dev) console.log("HTTP error! status: ${response.status}"); // throw new Error(`HTTP error! status: ${response.status}`); } return response.json(); }) .then(async (responseJSON) => { resolve(responseJSON.data); }).catch((error) => { if (error instanceof TypeError) { console.error('Network error:', error); // AWARIA SERWERA WYPOKU } else { console.error('Other error:', error); } reject(error); }); }); } function postFavouriteToAPI(favourite, resource, id) { let apiURL = `https://wykop.pl/api/v3/favourites`; const method = favourite ? "POST" : "DELETE"; const body = { data: { type: resource, source_id: id } } return new Promise(async (resolve, reject) => { await fetch(apiURL, { method: method, headers: { "Content-Type": "application/json", Authorization: "Bearer " + window.localStorage.getItem("token"), }, body: JSON.stringify(body) }) .then((response) => { if (!response.ok) { if (dev) console.log("HTTP error! status: ${response.status}"); // throw new Error(`HTTP error! status: ${response.status}`); } return response.json(); }) .then(async (responseJSON) => { resolve(responseJSON.data); }).catch((error) => { if (error instanceof TypeError) { console.error('Network error:', error); // AWARIA SERWERA WYPOKU } else { console.error('Other error:', error); } reject(error); }); }); } // settings.addCommentPlusWhenVotingOnEntry, settings.addCommentPlusWhenVotingOnComment function postCommentPlus1ToAPI(sectionEntry) { if (!sectionEntry || !sectionEntry.__vue__) return; const resource = sectionEntry.__vue__.item.resource; let entryId; let authorUsername = sectionEntry.__vue__.item.author.username; if (resource === "entry") entryId = sectionEntry.__vue__.item.id; else if (resource === "entry_comment") entryId = sectionEntry.__vue__.item.parent.id; // TODO ZNALEZISKA let apiURL = `https://wykop.pl/api/v3/entries/${entryId}/comments`; const method = "POST"; const body = { data: { "content": `@${authorUsername} [+](https://greasyfork.org/en/scripts/489949)1`, "adult": false } } /* "data": { "content": "**foobar** __foobar__ [lorem](https://www.wykop.pl) impsum!!! #nsfw #wykop", "embed": "1fde707843ss3fbe9cb4eed0asdfsdfc64ab9a4df6084199b39d2", "photo": "e07843ss3fbe9cb4saeed0asdfsdfc64b9a4df6084199b39d2", "adult": false } } */ return new Promise(async (resolve, reject) => { await fetch(apiURL, { method: method, headers: { "Content-Type": "application/json", Authorization: "Bearer " + window.localStorage.getItem("token"), }, body: JSON.stringify(body) }) .then((response) => { if (!response.ok) { if (dev) console.log("HTTP error! status: ${response.status}"); // throw new Error(`HTTP error! status: ${response.status}`); } return response.json(); }) .then(async (responseJSON) => { resolve(responseJSON.data); }).catch((error) => { if (error instanceof TypeError) { console.error('Network error:', error); // AWARIA SERWERA WYPOKU } else { console.error('Other error:', error); } reject(error); }); }); } // li.more click document.addEventListener("click", async function (e) { if (e.target.closest("div.buttons button.plus")) { const sectionEntry = e.target.closest("section.entry[id]"); if (sectionEntry.__vue__?.item?.voted == 1) { // if (settings.addCommentPlusWhenVotingOnEntry && sectionEntry && sectionEntry.__vue__?.item?.resource == "entry") // { // postCommentPlus1ToAPI(sectionEntry); // } // else if (settings.addCommentPlusWhenVotingOnComment && sectionEntry && sectionEntry.__vue__?.item?.resource == "entry_comment") // { // postCommentPlus1ToAPI(sectionEntry); // } } } if (e.target.matches("li.more span")) { e.preventDefault(); let sectionEntry = e.target.closest("section.entry"); const entryId = e.target.dataset.entryId; const commentId = e.target.dataset.commentId; if (dev) console.log(`Wykop XS pobiera listę ${e.target.dataset.votesUp} plusujących`); e.target.closest("section.entry-voters").innerHTML = `<span>(Wykop X: wczytywanie ${e.target.dataset.votesUp} plusujących...)</span>`; let voters = await fetchAllVotersFromAPI(entryId, commentId); appendVotersToEntry(sectionEntry, voters); return; } if (e.target.matches("span.favouriteButton")) { e.preventDefault(); if (e.target.dataset.isFavourite == "true") { if (e.target.dataset.commentId) postFavouriteToAPI(false, "entry_comment", e.target.dataset.commentId); else postFavouriteToAPI(false, "entry", e.target.dataset.entryId); e.target.parentElement.classList.remove("active"); e.target.dataset.isFavourite = "false"; } else if (e.target.dataset.isFavourite == "false") { if (e.target.dataset.commentId) postFavouriteToAPI(true, "entry_comment", e.target.dataset.commentId); else postFavouriteToAPI(true, "entry", e.target.dataset.entryId); e.target.parentElement.classList.add("active"); e.target.dataset.isFavourite = "true"; } return; } }, false); /* CSS WYKOP XS MIKROCZAT */ if (settings?.hideShareButton) CSS += `section.actions ul li.sharing { display: none!important; }`; /* Wykop X Style 3.0 */ CSS += ` :root { --kolorBananowy1: rgba(255, 185, 0, 1); --tagChannelColor: rgba(0, 183, 255, 1); --pmChannelColor: rgba(255, 89, 23, 1); --smallBorderRadius: 4px; } div[data-modal="entryVoters"] section.entry-voters::after {content: none!important;} /* Wykop X Style PROMO */ `; /* LISTA PLUSUJĄCYCH CSS, PRZYCISK DODAJ DO ULUBIONYCH */ if (settings?.entryVotersListEnable) { CSS += ` /* Chrome 109, Firefox 115 */ @supports not (display: block flex) { section.entry-voters ul { display: flex; } } section.entry-voters ul { display: block flex; row-gap: 0px; flex-wrap: wrap; align-items: baseline; padding: 0 0 0 0; margin: 0; margin-top: 8px; list-style-type: none; position: relative; } section.entry-voters ul, section.entry-voters > span { font-size: var(--entryVotersTextFontSize, 12px); color: var(--gullGray); } section.entry-voters ul::before { content: "Plusujący: "; margin-right: 0.2em; } section.entry-voters ul li.more { cursor: pointer; font-weight: 700; text-transform: uppercase; } section.entry-voters ul li::after { content: " • "; margin: 0px 0.2em 0px 0em; } section.entry-voters ul li.more::after, section.entry-voters ul li:only-child::after { content: none; } section.entry-voters ul li a.username span { font-weight: normal; } section.entry-voters ul li a.username i { display: none; font-size: 0.8em; font-style: normal; bottom: 0px; position: relative; } section.entry-voters ul li a.username i:has(+span) { margin-right: 1px; } section.entry-voters ul li a.username i.follow-true, section.entry-voters ul li a.username i.blacklist-true, section.entry-voters ul li a.username i.banned , section.entry-voters ul li a.username i.suspended, section.entry-voters ul li a.username i.removed, section.entry-voters ul li a.username i.f-gender, section.entry-voters ul li a.username i.m-gender { display: inline flex;} section.entry-voters ul li a.username i.follow-true::before { content: '🔔'; } section.entry-voters ul li a.username i.blacklist-true::before { content: '⛔'; } section.entry-voters ul li a.username i.banned::before { content: '🍌'; } section.entry-voters ul li a.username i.suspended::before { content: '✖'; } section.entry-voters ul li a.username i.removed::before { content: '❌'; } section.entry-voters ul li a.username i.f-gender::before { content: '🟣'; font-size: 0.7em; bottom: 3px; } section.entry-voters ul li:has(a.username) { order: 6; } section.entry-voters ul li.more { order: 100; } `; if (settings?.votersFollowFirst) CSS += `section.entry-voters ul li:has(a.username.follow-true) { order: 1; }`; if (settings?.votersBlackFirst) CSS += `section.entry-voters ul li:has(a.username.burgundy-profile) { order: 3; }`; if (settings?.votersOrangeFirst) CSS += `section.entry-voters ul li:has(a.username.orange-profile) { order: 4; }`; if (settings?.votersGreenFirst) CSS += `section.entry-voters ul li:has(a.username.green-profile) { order: 5; }`; if (settings?.votersBlacklistLast) CSS += `section.entry-voters ul li:has(a.username.blacklist-true) { order: 7; }`; if (settings?.votersBannedLast) CSS += `section.entry-voters ul li:has(a.username.banned) { order: 8; }`; if (settings?.votersSuspendedLast) CSS += `section.entry-voters ul li:has(a.username.banned) { order: 9; }`; if (settings?.votersRemovedLast) CSS += `section.entry-voters ul li:has(a.username.removed) { order: 10; }`; if (!settings?.votersColorOrange) CSS += `section.entry-voters ul li a.username.orange-profile { color: var(--gullGray); }`; if (!settings?.votersColorGreen) CSS += `section.entry-voters ul li a.username.green-profile { color: var(--gullGray); }`; if (!settings?.votersColorBurgundy) CSS += `section.entry-voters ul li a.username.burgundy-profile { color: var(--gullGray); }`; CSS += ` section.entry-voters ul li a.username.banned:not(.removed) span { color: var(--kolorBananowy1); }; section.entry-voters ul li a.username.suspended:not(.removed) span { color: var(--heather); } section.entry-voters ul li a.username.removed span { color: var(--heather); } [data-night-mode] section.entry-voters ul li a.username.removed span { background-color: rgba(255, 255, 255, 0.1); padding-left: 5px; padding-right: 5px; } `; } /* ULUBIONE */ CSS += ` section.actions > ul > li.favourite { cursor: pointer; user-select: none; color: var(--gullGray); font-size: 14px; padding-left: 26px; transition: color .2s ease, opacity .2s ease; } .actions li.favourite span::before { content: ''; width: 18px; height: 18px; display: block; position: absolute; left: 0; background: var(--gullGray); transition: background .2s ease; -webkit-mask-size: 18px 18px; mask-size: 18px 18px; -webkit-mask: url(/static/img/svg/favourite.svg) no-repeat center; mask-image: url(/static/img/svg/favourite.svg); } .actions li.favourite.active span::before { background: var(--orange); -webkit-mask: url(/static/img/svg/favourite-filled.svg) no-repeat center; mask-image: url(/static/img/svg/favourite-filled.svg); } `; /* HIDE ADS ALWAYS */ if (settings.hideAds) { CSS += `.pub-slot-wrapper { display: none!important; }`; } /* HIDE WYKOP XS PROMO FROM STYLUS */ CSS += `.wykopxs, body div.main-content[class] section > section.sidebar::after { display: none!important; }`; styleElement.textContent = CSS; document.head.appendChild(styleElement); })();