Free Talk Friday #98

// ==UserScript== // @name Show Reply Times // @version 0.0.4.1 // @description show reply times for reddit comments in a thread // @author anothershittyalt // @include /https://(.).reddit.com/r/counting/comments/(.) // @namespace https://greasyfork.org/users/32246 // ==/UserScript== /* jshint -W097 */ 'use strict';

//add CSS from /r/reddit_timestamps/stylesheet var link = document.createElement('link'); link.setAttribute('rel', 'stylesheet'); link.setAttribute('type', 'text/css'); link.setAttribute('href', 'https://a.thumbs.redditmedia.com/Hbef45nswkkeZVr-ODTUBUi9EyFiPAN4NgCV_6F7_j0.css'); document.getElementsByTagName('head')[0].appendChild(link);

//convert seconds to a h:m:s string function time(t){ var h = Math.floor(t/3600); var m = Math.floor((t%3600) / 60); var s = t%60; if(h > 0){h = h.toString() + "h ";} else{h = ""}; if(m > 0){m = m.toString() + "m ";} else{m = ""}; s = s.toString() + "s"; return h+m+s; }

//fetch reply times on load window.addEventListener('load', function() { //grab all the comments in the page var comments = document.getElementsByClassName("sitetable")[1]; comments = comments.getElementsByClassName("comment");

//keep track of whether a comment is "marked" or not so we dont parse it twice
var commentsMarked = []
for(var i = 0; i < comments.length; i++){
    commentsMarked.push(false);
}

//HTMLCollections don't work with .indexOf() so we use this to find a certain element in them instead
function search(list, item){
    for(var i = 0; i < comments.length; i++){
        if(list[i] == item){return i;}
    }
    return -1;
}

function crawl(comment, last){
    //mark the comment
    var searchIndex = search(comments, comment);
    commentsMarked[searchIndex] = true;

    //get all the children of the comment
    var c = comment.getElementsByClassName("comment");

    //for each child comment...
    for(var i = 0; i < c.length; i++){
        //check if the child comment hasn't been marked already
        searchIndex = search(comments, c[i]);
        if(commentsMarked[searchIndex] == false){
            //if it hasn't then grab the timestamp and get the difference between this and it's parent
            var time_element = c[i].getElementsByTagName("time")[0]
            var timestamp_b = time_element.getAttribute("datetime");
            timestamp_b = new Date(timestamp_b).getTime()/1000;
            var diff = timestamp_b - last;

            //then add that difference to the end of the timestamp (if it isn't there already)
            var title = time_element.getAttribute("title");
            if(title.indexOf(";") == -1){time_element.setAttribute("title", title + "; " + time(diff) + " reply");}
            if(diff <= 1){time_element.setAttribute("style", "font-weight: bold;");}
            commentsMarked[searchIndex] = true;
        }
        //do this recursively
        crawl(c[i], timestamp_b);
    }
}

//crawl() through every single unmarked comment
for(var i = 0; i < comments.length; i++){
    if(commentsMarked[i] == false){
        var timestamp = comments[i].getElementsByTagName("time")[0].getAttribute("datetime");
        timestamp = new Date(timestamp).getTime()/1000;
        crawl(comments[i], timestamp);
        commentsMarked[i] = true
    }
}

}, false);

//fetch reply times on newly added comments (TODO: something about this method feels like it would be gross/hacky/slow, but idk) window.addEventListener("DOMNodeInserted", function(e) { //grab the node added var node = e.relatedNode;

//check if the node is a live-timestamp that doesn't have a reply time added to it
if(node.getAttribute("class") == "live-timestamp"){
    if(node.getAttribute("title").indexOf(";") == -1){
        //grab the comment attached to that and its timestamp
        //that parentNode chain though
        var comment = node.parentNode.parentNode.parentNode;
        var parent = comment.parentNode.parentNode.parentNode;

        //check if the elements we grabbed are actually both comments or not
        if(comment.getAttribute("data-type") == "comment" && parent.getAttribute("data-type") == "comment"){
            //grab the timestamp for the parent
            var timestamp = parent.getElementsByTagName("time")[0].getAttribute("datetime");
            timestamp = new Date(timestamp).getTime()/1000;

            //grab the timestamp for the new comment and get the difference between that and it's parent
            var timestamp_b = node.getAttribute("datetime");
            timestamp_b = new Date(timestamp_b).getTime()/1000;
            var diff = timestamp_b - timestamp;

            //then add that difference to the end of the child's timestamp (if it isn't there already somehow)
            var title = node.getAttribute("title");
            if(title.indexOf(";") == -1){node.setAttribute("title", title + "; " + time(diff) + " reply");}
            if(diff <= 1){node.setAttribute("style", "font-weight: bold;");}
        }
    }
}

}, false);

/r/counting Thread Parent