Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // ==UserScript==
- // @name Poal Tweaks
- // @author YoureJewish
- // @version 0.3.7
- // @include https://Poal.co/*
- // @grant GM_setValue
- // @grant GM_getValue
- // @grant GM_addStyle
- // #grant GM_deleteValue
- // ==/UserScript==
- // **** Settings ****
- var settings = {
- targetedDomains: ['searchvoat.co'],
- blockedUsers: ['aou'],
- shouldHidePoalIcons: false,
- shouldNormalizeUsernames: false,
- shouldForceLinksToNewTab: false,
- shouldHideRightSidebar: true,
- shouldMoveLeftSidebar: true
- };
- // **** Utils ****
- class utilities {
- constructor() {}
- // Control Helpers
- getTagContainer(userName) {
- if(!this.tagButton) {
- // Input Toggle Button
- let button = document.createElement('a');
- button.id = 'buttontag';
- button.classList = 'sbm-post pure-button';
- button.text = 'Set User Tag';
- button.setAttribute('state', 'hidden');
- // Text Input
- let input = document.createElement('input');
- input.setAttribute('placeholder', 'Set Custom User Tag...');
- input.setAttribute('maxlength', '30');
- input.style = 'background-color:#2b3447;color:#fff;border-radius:18px;box-sizing:border-box;border:solid #3a3a3a 1px;font-size:14px;padding:8px;';
- input.classList = 'pure-u-1';
- input.id = 'inputtag';
- // Color Input Elements
- let colorInputLabel = document.createElement('label')
- colorInputLabel.innerHTML = 'Tag Text Color';
- colorInputLabel.style = 'color:#bdbdbd;';
- let colorInput = document.createElement('input');
- colorInput.id = 'colortag';
- colorInput.setAttribute('type', 'color');
- colorInput.style = 'color:#bdbdbd;background-color:rgba(51,51,51,0.5);width:100%;margin:5px 0';
- // Background Color Input Elements
- let backgroundColorInputLabel = document.createElement('label')
- backgroundColorInputLabel.innerHTML = 'Tag Background Color';
- backgroundColorInputLabel.style = 'color:#bdbdbd;';
- let backgroundColorInput = document.createElement('input');
- backgroundColorInput.id = 'backgroundcolortag';
- backgroundColorInput.setAttribute('type', 'color');
- backgroundColorInput.style = 'color:#bdbdbd;background-color:rgba(51,51,51,0.5);width:100%;margin-top:5px';
- let colorInputContainer = document.createElement('div');
- colorInputContainer.style = 'width:100%;text-align:center;padding-top:5px;margin:5px 0;border-radius:18px;border:solid #3a3a3a 1px;background-color:rgba(51,51,51,0.5);';
- colorInputContainer.append(colorInputLabel);
- colorInputContainer.append(colorInput);
- colorInputContainer.append(backgroundColorInputLabel);
- colorInputContainer.append(backgroundColorInput);
- // Input container
- let inputContainer = document.createElement('div');
- inputContainer.id = 'tagInputContainer';
- inputContainer.style.display = 'none';
- inputContainer.append(input);
- inputContainer.append(colorInputContainer);
- // Final Container
- let container = document.createElement('div');
- container.append(button);
- container.append(inputContainer);
- this.tagButton = container;
- }
- let tagValues = this.getUserTag(userName);
- console.log(tagValues);
- let clone = this.tagButton.cloneNode(true);
- let cloneInput = clone.querySelector('#inputtag');
- cloneInput.setAttribute('username', userName);
- cloneInput.value = tagValues?.text || '';
- let cloneColorInput = clone.querySelector('#colortag');
- cloneColorInput.value = tagValues?.color || '#dddddd';
- let cloneBackgroundInput = clone.querySelector('#backgroundcolortag');
- cloneBackgroundInput.value = tagValues?.background || '#4163ac';
- return clone;
- }
- getNameTag(tagText) {
- if(!this.tag){
- let span = document.createElement('span');
- span.classList = 'cstmTag';
- this.tag = span;
- }
- let clone = this.tag.cloneNode();
- clone.innerHTML = tagText;
- return clone;
- }
- getRemoveButton(parentSelector) {
- if(!this.removeButton) {
- let path = document.createElementNS('http://www.w3.org/2000/svg', 'path');
- path.setAttribute('d', 'm 0,8.0189707 c 0,4.4112003 3.58880304,8.0000003 8.00000004,8.0000003 4.4111999,0 7.9999999,-3.5888 7.9999999,-8.0000003 0,-4.411197 -3.58873,-8.00000005 -7.9999999,-8.00000005 -4.411274,0 -8.00000004,3.58880305 -8.00000004,8.00000005 z m 13.16820994,0 c 0,2.8497603 -2.31845,5.1682103 -5.1682099,5.1682103 -0.91132,0 -1.767717,-0.23795 -2.511953,-0.65368 L 12.716526,5.5070177 c 0.41573,0.744236 0.65376,1.600633 0.65376,2.511953 z M 8.2020762,2.8508337 c 0.91132,0 1.76772,0.237958 2.5119498,0.653686 L 3.6877022,10.531001 C 3.2718972,9.7867607 3.0339392,8.9303707 3.0339392,8.0189707 c 0,-2.849756 2.318381,-5.168137 5.168137,-5.168137 z');
- let svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
- svg.setAttribute('viewBox', '0 0 16 16');
- svg.append(path);
- let span = document.createElement('span');
- span.classList = 'icons';
- span.style = 'top:0px;';
- span.append(svg);
- let container = document.createElement('div');
- container.style = 'float:right;cursor:pointer;margin-left:0.25em';
- container.append(span);
- container.setAttribute('toggle', parentSelector);
- container.querySelectorAll('*').forEach(el => { el.setAttribute('toggle', parentSelector) });
- this.removeButton = container;
- }
- return this.removeButton.cloneNode(true);
- }
- getExpandButton(element) {
- if(!element){ return; }
- if(!this.expandButton) {
- let path1 = document.createElementNS("http://www.w3.org/2000/svg", "path");
- path1.setAttribute('d', 'M13.5,2.5C12,1,10.1,0.2,8,0.2C5.9,0.2,4,1,2.5,2.5c-3,3-3,8,0,11C4,15,5.9,15.8,8,15.8s4-0.8,5.5-2.3 C16.6,10.5,16.6,5.5,13.5,2.5z M12.5,12.5c-1.2,1.2-2.8,1.9-4.5,1.9s-3.3-0.7-4.5-1.9C1,10,1,6,3.5,3.5C4.7,2.3,6.3,1.6,8,1.6 c1.7,0,3.3,0.7,4.5,1.9C15,6,15,10,12.5,12.5z');
- let path2 = document.createElementNS("http://www.w3.org/2000/svg", "path");
- path2.setAttribute('d', 'M12.3,7.3H8.7V3.7C8.7,3.4,8.4,3,8,3S7.3,3.4,7.3,3.7v3.5H3.7C3.4,7.3,3,7.6,3,8s0.3,0.7,0.7,0.7h3.5v3.5 C7.3,12.6,7.6,13,8,13s0.7-0.3,0.7-0.7V8.7h3.5C12.6,8.7,13,8.4,13,8S12.6,7.3,12.3,7.3z');
- let svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
- svg.setAttribute('viewBox', '0 0 16 16');
- svg.appendChild(path1);
- svg.appendChild(path2);
- let svgSpan = document.createElement('span');
- svgSpan.classList = 'icons';
- svgSpan.style = 'margin-top:-1em;margin-left:0em;margin-right:0.5em;display:inline-block;';
- svgSpan.appendChild(svg);
- let nameSpan = document.createElement('a');
- nameSpan.id = 'name';
- nameSpan.style = 'font-weight:600;font-size:small;';
- let container = document.createElement('a');
- container.classList = 'pure-button';
- container.style = 'background-color:transparent;color:#adadad;width:100%;text-align:center;'
- container.append(svgSpan);
- container.append(nameSpan);
- this.expandButton = container;
- }
- let expandClone = this.expandButton.cloneNode(true);
- let id = element.closest('.main').id;
- expandClone.setAttribute('bodyid', element.closest('.main').id);
- expandClone.querySelectorAll('*').forEach(el => { el.setAttribute('bodyid', id) });
- let name = expandClone.querySelector('#name');
- if(name) {
- name.classList = element.classList;
- name.innerHTML = element.text.trim();
- }
- return expandClone;
- }
- // Location Helpers
- onHomePage() {
- let mainPages = ['hot', 'new', 'pop', 'top'];
- let url = document.URL;
- return mainPages.some(el => {
- if(url.endsWith(el) && !url.includes('/s/')) {
- return true;
- }
- });
- }
- onSubPage() {
- return document.URL.includes('/s/');
- }
- onUserPage() {
- return document.URL.includes('/u/');
- }
- onMessagesPage() {
- return document.URL.includes('/messages/');
- }
- // Tag Helpers
- getSavedTags() {
- let tags = this.tryJsonParse(GM_getValue('userTags'));
- if(tags != false) {
- return tags;
- }
- else { return {}; }
- }
- getUserTag(userName) {
- userName = userName.trim();
- let tags = this.tryJsonParse(GM_getValue('userTags'));
- if(tags != false && userName) {
- if(tags != false){
- return tags[userName];
- }
- }
- else { return ''; }
- }
- saveUserTags(jTags) {
- console.log(jTags);
- let sTags = JSON.stringify(jTags);
- GM_setValue('userTags', sTags);
- }
- // General Helpers
- getUsernameElements() {
- return this.find('a[class*="lv"]');
- }
- hide(element) {
- if(element) { element.style.display = 'none'; }
- }
- show(element) {
- if(element) { element.style.display = 'unset'; }
- }
- find(selector, single) {
- if(single) { return document.querySelector(selector); }
- else { return document.querySelectorAll(selector); }
- }
- tryJsonParse(str) {
- try { return JSON.parse(str); }
- catch (e) { return false; }
- }
- normalizeSettingStrings(strArray) {
- strArray.forEach(function(part, index) {
- this[index] = this[index].toLowerCase().replace('(', '').replace(')', '').replace('www.', '');
- }, strArray);
- return strArray;
- }
- }
- var utils = new utilities();
- // **** Username Normalization ****
- function hidePoalIcons() {
- if(settings.shouldHidePoalIcons == true) {
- GM_addStyle('.utagicon { display:none !important; }')
- }
- }
- function normalizeUsernames() {
- if(settings.shouldNormalizeUsernames == true) {
- GM_addStyle('.lv0, .lv2, .lv6, .lv20, .lv30, .lv50, .lv100 { background-color:transparent !important; color:#bdbdbd !important; border:none !important; }');
- }
- }
- // **** Custom User Tags ****
- function handleUserTags() {
- GM_addStyle('.cstmTag { display:inline-block;margin-left:3px;margin:0px 5px;padding:2px 5px !important;border-radius:8px;border:1px solid #ddd; }');
- let userTags = utils.getSavedTags();
- let userKeys = Object.keys(userTags);
- let userElements = utils.getUsernameElements();
- userElements.forEach(el => {
- let userName = el.text;
- if(userKeys.includes(userName)) {
- let parent = el.parentElement;
- let tagValues = userTags[userName];
- if(!parent.querySelector('.cstmTag')) {
- let tag = utils.getNameTag(tagValues.text);
- tag.style = 'background-color:' + tagValues.background + ';color:' + tagValues.color;
- parent.insertBefore(tag, el.nextSibling);
- }
- }
- });
- }
- function addTagButton() {
- if(utils.onUserPage()) {
- let parent = document.querySelector('#tsb #innersb');
- let divider = parent.querySelector('.pmessage');
- let tagContainer = utils.getTagContainer(utils.find('.noshit', true).textContent.trim());
- parent.insertBefore(tagContainer, divider);
- document.addEventListener('click', function (event) {
- let button = event.target;
- if(button.id == 'buttontag') {
- let inputContainer = utils.find('#tagInputContainer', true);
- if(button.getAttribute('state') == 'hidden') {
- utils.show(inputContainer);
- button.setAttribute('state', 'visible');
- button.text = 'Save User Tag';
- }
- else {
- updateUserTag(utils.find('.noshit', true).textContent, utils.find('#inputtag', true).value, utils.find('#backgroundcolortag', true).value, utils.find('#colortag', true).value);
- utils.hide(inputContainer);
- button.setAttribute('state', 'hidden');
- button.text = 'Set User Tag';
- }
- }
- });
- }
- }
- function updateUserTag(userName, tagValue, tagBackground, tagColor) {
- userName = userName.trim();
- let list = utils.getSavedTags();
- if(tagValue) {
- let values = {};
- values.text = tagValue.trim();
- values.background = tagBackground;
- values.color = tagColor;
- list[userName.trim()] = values;
- }
- else {
- delete list[userName.trim()];
- }
- utils.saveUserTags(list);
- }
- // **** Sidebar Alterations ****
- function hideRightSidebar() {
- if(settings.shouldHideRightSidebar == true && utils.onHomePage() == true) {
- utils.find('#tsbr > #innersb > .sidebarlists, a.togglesbl').forEach(el => { el.style.display = 'none'; });
- }
- }
- function moveLeftSidebar () {
- if(settings.shouldMoveLeftSidebar == true && (utils.onHomePage() == true || utils.onSubPage() == true)) {
- let container = utils.find('#tsbl > #innersb > .sidebarlists', true);
- if(container) {
- if(utils.onSubPage() == true) {
- utils.find('#tsbr > #innersb', true).append(container);
- }
- else {
- utils.find('#tsbr > #innersb', true).prepend(container);
- }
- utils.find('#tsbr > #innersb > br, div.togglesbl').forEach(el => { el.style.display = 'none'; });
- }
- }
- }
- // **** Force links to open in new tab ****
- function forceNewTab() {
- if(settings.shouldForceLinksToNewTab == true) {
- utils.find('.post-heading > a.title:not([target]), .comcombo').forEach(el => { el.setAttribute('target', '_blank'); });
- }
- }
- // **** Block Anyone ****
- function hideUserPosts() {
- if(utils.onHomePage() == true) {
- let existingPosts = utils.getUsernameElements();
- existingPosts.forEach(el => {
- if(settings.blockedUsers.includes(el.text.toLowerCase())) {
- utils.hide(el.closest('.post'));
- }
- });
- }
- let postId = GM_getValue('announcementPid');
- let post = utils.find('div[pid="' + postId + '"]', true);
- if(postId && post) {
- utils.hide(post.closest('#announcement-post'));
- }
- }
- function handleMessageCollapse() {
- if(utils.onMessagesPage()) {
- let attachEvent = false;
- let messages = utils.getUsernameElements();
- messages.forEach(el => {
- if(settings.blockedUsers.includes(el.text.trim().toLowerCase())) {
- let parent = el.closest('#pmess');
- let body = parent.querySelector('.main');
- let unread = parent.querySelector('.readmsg');
- if(unread){ unread.click(); }
- let expand = utils.getExpandButton(el);
- parent.prepend(expand);
- expand.addEventListener('click', function (event) {
- let id = event.target.getAttribute('bodyid');
- expandMessage(id);
- });
- utils.hide(body);
- parent.style = 'min-height:0;padding:0 0.8em 0 0.8em;';
- }
- });
- }
- }
- function handleCommentCollapse() {
- let comments = utils.find('div.commenthead.togglecommenthead.collapse > a:nth-child(2)');
- comments.forEach(el => {
- if(settings.blockedUsers.includes(el.text.trim().toLowerCase())) {
- let parent = el.closest('.commenthead.togglecommenthead.collapse');
- parent.style.opacity = '0.2';
- parent.click();
- }
- })
- let loadMore = utils.find('.comments-block > .loadsibling', true);
- if(loadMore) {
- utils.find('.comments-block > .loadsibling').forEach(el => {
- el.addEventListener('click', function () {
- setTimeout(function(){
- handleCommentCollapse();
- }, 1000);
- });
- })
- }
- }
- function expandMessage(id) {
- let body = utils.find('#' + id, true);
- if(body && body.style.display == "none") {
- utils.show(body);
- }
- else { utils.hide(body); }
- }
- function insertAnnouncementRemove() {
- if(utils.onHomePage()) {
- let announcement = utils.find('#announcement-post .pbody', true);
- if(announcement) {
- let remove = utils.getRemoveButton('#announcement-post');
- announcement.prepend(remove);
- document.body.addEventListener('click', function (event) {
- let toggle = event.target.getAttribute('toggle');
- if(toggle) {
- utils.hide(utils.find(toggle, true));
- let postId = utils.find('.post', true).getAttribute('pid');
- if(postId) { GM_setValue('announcementPid', postId); }
- }
- });
- }
- }
- }
- // **** Highlight Tagged Domains ****
- function highlightDomains() {
- let domains = document.querySelectorAll('.domain');
- if(domains) {
- domains.forEach(el => {
- if(settings.targetedDomains.includes(el.innerHTML.replace('(', '').replace(')', '').replace('www.', ''))) {
- el.style = 'color:#a00;font-weight:900;font-size:0.75em;';
- }
- });
- }
- }
- // **** Mutation Observer for posts/links *****
- function createMutationObserver() {
- let postsNode = document.querySelector('.alldaposts');
- if(postsNode) {
- const observer = new MutationObserver(function(mutations_list) {
- hideUserPosts();
- highlightDomains();
- forceNewTab();
- normalizeUsernames();
- handleUserTags();
- setTimeout(function() { hidePoalIcons();}, 250);
- });
- observer.observe(postsNode, { subtree: false, childList: true });
- }
- }
- // Init All - At one point there was a reason this existed...
- function initAll() {
- settings.targetedDomains = utils.normalizeSettingStrings(settings.targetedDomains);
- settings.blockedUsers = utils.normalizeSettingStrings(settings.blockedUsers);
- hideRightSidebar();
- moveLeftSidebar();
- forceNewTab();
- hidePoalIcons();
- normalizeUsernames();
- highlightDomains();
- insertAnnouncementRemove();
- handleMessageCollapse();
- handleCommentCollapse();
- hideUserPosts();
- addTagButton();
- handleUserTags();
- createMutationObserver();
- }
- initAll();
Advertisement
Add Comment
Please, Sign In to add comment