Hide BPL Trolls and other junk

Cleanup new BPL

// ==UserScript==
// @name        Hide BPL Trolls and other junk
// @namespace   ffmike
// @description Cleanup new BPL
// @grant       none
// @include     https://bplight.wpengine.com/*
// @include     https://backpackinglight.com/*
// @include     http://backpackinglight.com/*
// @version     8
// @domain      www.backpackinglight.com
// @license     CC0 1.0; https://creativecommons.org/publicdomain/zero/1.0/
// ==/UserScript==

// In part shamelessly based on https://greasyfork.org/en/scripts/48-maximumpc-troll-remover/code
$(function () {
    // Utility function to inject global CSS into HEAD tag
    function addGlobalStyle(css) {
      var head, style;
      head = document.getElementsByTagName('head')[0];
      if (!head) { return; }
      style = document.createElement('style');
      style.type = 'text/css';
      style.innerHTML = css;
      head.appendChild(style);
    }
  
    // Emulate the GM_*value APIs - see https://gist.githubusercontent.com/arantius/3123124/raw/grant-none-shim.js
    const __GM_STORAGE_PREFIX = [
       '', GM_info.script.namespace, GM_info.script.name, ''].join('***');

    function GM_deleteValue(aKey) {
     'use strict';
     localStorage.removeItem(__GM_STORAGE_PREFIX + aKey);
    }

    function GM_getValue(aKey, aDefault) {
     'use strict';
     let val = localStorage.getItem(__GM_STORAGE_PREFIX + aKey)
     if (null === val && 'undefined' != typeof aDefault) return aDefault;
     return val;
    }

    function GM_listValues() {
     'use strict';
     let prefixLen = __GM_STORAGE_PREFIX.length;
     let values = [];
     let i = 0;
     for (let i = 0; i < localStorage.length; i++) {
       let k = localStorage.key(i);
       if (k.substr(0, prefixLen) === __GM_STORAGE_PREFIX) {
         values.push(k.substr(prefixLen));
       }
     }
     return values;
    }

    function GM_setValue(aKey, aVal) {
     'use strict';
     localStorage.setItem(__GM_STORAGE_PREFIX + aKey, aVal);
    }

    function GM_getResourceURL(aName) {
     'use strict';
     return 'greasemonkey-script:' + GM_info.uuid + '/' + aName;
    }
    
    // Hide various clutter, including the subscription blocks and forum instructions
    $("#text-28").hide();      // Newsletter signup
    $("#text-29").hide();      // Footer subscription link
    $("#text-32").hide();      // How the forums work
    $("#text-34").hide();      // Sidebar subscription link
    $("#menu-item-15").hide(); // Menu subscription link
    $(".bbp-header").hide();   // Forum header
    $(".bbp-footer").hide();   // Forum footer
  
    // Hide the 'related posts' display
    addGlobalStyle('div.zem_rp_content { display: none ! important; }');
    
    // Smaller darker fonts and generally condensed presentation
    addGlobalStyle("body, #bbpress-forums, #bbpress-forums .bbp-reply-content, #bbpress-forums .bbp-reply-content p {font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif !important; font-weight: 400 !important; font-size: 11px !important; color: black !important; line-height: 1.25 !important; }")
    addGlobalStyle("article.forum h1.entry-title, article.topic h1.entry-title, article.reply h1.entry-title, article.bp_members h1.entry-title {font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif !important; font-size: 18px !important;color: black !important;}");
    addGlobalStyle('h1 {margin-bottom: 6px; }');
    addGlobalStyle('.entry-content code {color: black !important; }');
    addGlobalStyle('.entry-content a {color: black !important; }');
    addGlobalStyle('.entry-content a.bbp-topic-permalink {font-weight: 600 !important; }');
    addGlobalStyle('.bbp-reply-author {font-size: 8px !important; padding-bottom: 2px !important; }');
    addGlobalStyle('.bbp-reply-content {padding-bottom: 0px !important; }');
    addGlobalStyle('.bbp-author-role {font-size: 8px !important; }');
    addGlobalStyle('.bbp-user-nicename {margin-bottom: 0px !important; }');
    addGlobalStyle('.entry {margin-bottom: 2px !important; }');
    addGlobalStyle('.entry-content ol, .entry-content p, .entry-content ul, .quote-caption {margin-bottom: 3px !important;}');
    addGlobalStyle('#bbpress-forums li.bbp-body ul.forum, #bbpress-forums li.bbp-body ul.topic {padding: 2px !important;}');
    addGlobalStyle('#bbpress-forums ul.bbp-replies {font-size: 11px !important; }');
    addGlobalStyle('#bbpress-forums a.bbp-reply-permalink {margin-top: 0px !important; }');
    
    // Indent paragraphs in forums (so you can still see them with all the extra spacing stripped out)
    addGlobalStyle('.bbp-reply-content p {text-indent: 15px !important;}');
    
    // Hide uselessly small avatars on topic list
    addGlobalStyle('.bbp-topic-started-by .bbp-author-avatar, .bbp-topic-freshness-author .bbp-author-avatar {display: none !important; }');

    // Make links visible
    addGlobalStyle('a {border-bottom: .0625rem solid skyblue !important; }');

    // Much less subtle even/odd row highlighting
    addGlobalStyle('#bbpress-forums div.odd, #bbpress-forums ul.odd {background-color: rgba(83, 207, 75, 0.27) !important}');
    
    // Style for stale topic marking (see below)
    addGlobalStyle('#bbpress-forums ul.stale {background-color: rgba(185, 207, 75, 0.28) !important}');
    
    // Hide the WordPress minibar
    $('#wpadminbar').hide();

    // Get rid of some wasted space
    addGlobalStyle('html {margin-top: 0px !important; }');
    addGlobalStyle('.site-container {margin-top: 0px !important; padding-top: 2px !important; }');
    addGlobalStyle('.site-inner {padding-top: 0px !important;}');

    // Move and shrink the navigation. Best on wide screens.
    addGlobalStyle('.nav-primary {position: absolute !important; top: 0px !important; left: 0px !important;}');
    addGlobalStyle('.nav-secondary {position:absolute !important; top: 33px !important;}');
    addGlobalStyle('.genesis-nav-menu {font-size: 9px !important; }');
    addGlobalStyle('.genesis-nav-menu a {padding: 7px !important; }');
    $('.nav-menu-bpl-logo-type-bold').html('BPL');
    $('.nav-menu-bpl-logo-type-ultralight').hide();
    addGlobalStyle('span.insider-icon::before {padding-bottom: 0px !important; margin-top: -2px !important; }');
    
    // Get rid of the Gear Deals link and the horrible spinning icon with it
    $('#menu-item-3367769').hide();
    
    // Hide breadcrumbs 
    $('.bbp-breadcrumb').hide();
    
    // Shrink avatars in forums
    forumAvatars = $('.avatar-80');
    faLength = forumAvatars.length;
    for(var i=0; i<faLength; i++) {
        forumAvatars[i].setAttribute("height", "20");
        forumAvatars[i].setAttribute("width", "20");
    }
        
    // Hide forums from main page
    // Right now hiding Gear Swap posts
    $(".bbp-topic-started-in a").each(function(index, value){
       if(value.href == 'https://backpackinglight.com/forums/forum/commerce/gear-swap/') {
           $(this).closest('.topic').hide();
       }    
    });
    
    // Hide all content from known trolls
    // If there are users you don't ever want to see posts from, add their handles to this list
    //var trollList = ["tipiwalter",
    //              "rosyfinch",
    //              "redmonk"
    //             ];
    var trollList = [];
    var trollLength = trollList.length;
    var userName, ref;
        
    // Look at all the author links on the page and hide the ones from known trolls
    $(".bbp-reply-author a.bbp-author-name").each(function(index, value) 
    {
        ref = value.href;
        var pieces = ref.split('/');
        userName = pieces[pieces.length - 2];
        for(var i=0; i<trollLength; i++) 
        {
            if(userName == trollList[i])
            {
                // console.log('Hiding post from ' + userName);
                // Hide the actual post, if any (won't be any on forum index)
                var replyDiv = $(this).closest('.reply')
                replyDiv.hide();
                // Note on the post header what was just hidden.
                var replyHeaderDiv = replyDiv.prev();
                var domHeader = replyHeaderDiv.get(0);
                // If we didn't get a header, then we must be on original post in the thread
                if(typeof domHeader === 'undefined') {
                   replyDiv = $(this).closest('.topic')
                   replyDiv.hide();
                   // Note on the post header what was just hidden.
                   replyHeaderDiv = replyDiv.prev();
                   domHeader = replyHeaderDiv.get(0);
                } 
                // Clicking header alternately reveals and hides post, in case you're feeling masochistic
                domHeader.setAttribute('onclick', '$(this).next().toggle();');
                var replyDateSpan = replyHeaderDiv.children('.bbp-meta').children('.bbp-reply-post-date');
                var existingDate = replyDateSpan.html();
                replyDateSpan.html(existingDate + ' - Hidden post from ' + userName);
                
                break;
            }
        }
     });

    // Add styling to topics with no new content since last visit
    // If we're on a forum index, should be able to grab the forum ID
    if ($('ul.bbp-topics').length > 0) {
        forum_id = $('ul.bbp-topics')[0].id;

       // Figure out where we were the last time we were on this topic page
       var last_most_recent_reply = GM_getValue(forum_id + 'most_recent_reply', 0);
       // console.log(last_most_recent_reply);
    
       var most_recent_parts;
       var most_recent_reply;
       if ($('li.bbp-topic-freshness a').length > 0) {
          topic_links = $('li.bbp-topic-freshness > a');
          // If on forum index, save most recent reply ID
          // NOTE: Unfortunately we can't get the reply ID of a topic with no replies yet
          for(var i=0; i<topic_links.length; i++) {
             most_recent_parts = topic_links[i].href.split('-');
             most_recent_reply = most_recent_parts[most_recent_parts.length - 1];
             if (!isNaN(parseInt(most_recent_reply))) {
                // console.log('setting ' + most_recent_reply);
                GM_setValue(forum_id + 'most_recent_reply', parseInt(most_recent_reply));
                break;
             }
          }
        
          // Now set styling on the topics with no new replies
          for(var i=0; i<topic_links.length; i++) {
             most_recent_parts = topic_links[i].href.split('-');
             most_recent_reply = most_recent_parts[most_recent_parts.length - 1];
             if (!isNaN(parseInt(most_recent_reply))) {
                if(parseInt(most_recent_reply) <= last_most_recent_reply) {
                   topic = topic_links[i].closest('.topic');
                   domTopic = document.getElementById(topic.id);
                   current_class = domTopic.getAttribute('class')
                   domTopic.setAttribute('class', current_class + ' stale');
               }
             }
          }
       }    
    }
    
});