Torn Forum Karma

Hide low karma posts

// ==UserScript==
// @name         Torn Forum Karma
// @namespace    https://torn.com/1714547
// @version      0.1
// @description  Hide low karma posts
// @author       Jox [1714547]
// @match        https://www.torn.com/forums.php
// @grant        none
// ==/UserScript==

(function() {
    'use strict';


    var targetNode = document.querySelector('.container');

    // Options for the observer (which mutations to observe)
    var config = {
        attributes: false,
        characterData: false,
        childList: true,
        subtree: true,
        attributeOldValue: false,
        characterDataOldValue: false };

    // Callback function to execute when mutations are observed
    var callback = function(mutationsList) {

        for(var mutation of mutationsList) {
            if (mutation.type == 'childList') {
                //console.log('A child node has been added or removed.',mutation);
                var threadList = document.querySelector('.threads-list');
                var threads = document.querySelector('.forums-thread');

                if(threadList || threads){
                    observer.disconnect();

                    var content = document.querySelector('.content-wrapper');

                    observer.observe(content, config);

                    if(threadList){
                        parseThreadsLists();
                    }

                    if(threads){
                        parseThreads();
                    }

                    break;
                }

                if(mutation.removedNodes.length > 0){
                    for(const node of mutation.removedNodes){
                        if(node.type == 1 && (node.childList.contains('threads-list') || node.childList.contains('forums-thread'))){
                            //console.log('Upsss, Got removed...');
                            break;
                        }
                    }
                }
            }
            else if (mutation.type == 'attributes') {
                //console.log('The ' + mutation.attributeName + ' attribute was modified.');
            }
        }
    };

    // Create an observer instance linked to the callback function
    var observer = new MutationObserver(callback);

    // Start observing the target node for configured mutations
    observer.observe(targetNode, config);

    // Later, you can stop observing
    //observer.disconnect();


    function parseThreadsLists(){
        //console.log('Thread list');

        observer.disconnect();

        var container = document.querySelector('.forums-committee-wrap');

        var myDiv = document.createElement('div');
        myDiv.classList.add('forums-committee', 'm-top10');
        var ul = document.createElement('ul');
        ul.classList.add('threads-list','fm-list','cont-gray','bottom-round');

        myDiv.appendChild(ul);
        container.parentElement.appendChild(myDiv);

        var dislikes = container.querySelectorAll('.dislike-icon');

        for(var dislike of dislikes){
            var dislikeThread = dislike.parentElement.parentElement.parentElement.parentElement;
            dislikeThread.remove();
            ul.appendChild(dislikeThread);
            //console.log(dislikeThread);
        }

        var content = document.querySelector('.content-wrapper');

        observer.observe(content, config);
    }


    function parseThreads(){
        //console.log('Threads');

        observer.disconnect();

        var posts = document.querySelectorAll('li > .column-wrap');


        for(var post of posts){
            var threadId = post.querySelector('.post-wrap').dataset.thread;
            var postId = post.querySelector('.post-wrap').dataset.post;
            //console.log(threadId, postId, post);

            var like = post.querySelector('.like > .value');
            var dislike = post.querySelector('.dislike > .value');

            //console.log(threadId, postId, like, dislike);

            if(parseInt(dislike.textContent) > parseInt(like.textContent)){
                //console.log('need to hide me');
                post.querySelector('.info-wrap').style.display = 'none';
                post.querySelector('.post-container').style.display = 'none';
            }

            var forInsertBefore = post.querySelector('.action-wrap > .right-part');

            if(!post.querySelector('.hide-me')){
                var li = document.createElement('li');
                li.innerHTML = 'show / hide';
                li.classList.add('hide-me');
                li.addEventListener('click', (e) => {
                    //console.log(e);
                    var container = e.srcElement.parentNode.parentNode.parentNode.parentNode;
                    //console.log(container);

                    var info = container.querySelector('.info-wrap');
                    var comment = container.querySelector('.post-container');

                    if(info.offsetWidth > 0 && info.offsetHeight > 0){
                        info.style.display = 'none';
                        comment.style.display = 'none';
                    }
                    else{
                        info.style.display = '';
                        comment.style.display = '';
                    }

                    //console.log(info, post);
                })

                forInsertBefore.parentNode.insertBefore(li, forInsertBefore.nextSibling);
            }


            //console.log(like, dislike);
        }


        var content = document.querySelector('.content-wrapper');

        observer.observe(content, config);
    }
})();