12

Update: I don't have time to fix it at the moment and have also come to doubt the sustainability of this approach since putting it online, so I tagged it as obsolete.


This is a very basic user script which does the following:

  • Checks the Review homepage if there's anything you can review

    • If so, it changes the title to (n) old_title where n is the number of review tasks you can perform
    • If not, it refreshes the page in 15 seconds

This is the script:

// ==UserScript==
// @name        Review Stalker
// @namespace   http://camilstaps.nl
// @description Stalks the StackExchange review pages
// @include     https://*stackexchange.com/review
// @include     https://*stackexchange.com/review/
// @include     https://stackoverflow.com/review
// @include     https://stackoverflow.com/review/
// @include     https://serverfault.com/review
// @include     https://serverfault.com/review/
// @include     https://superuser.com/review
// @include     https://superuser.com/review/
// @include     https://askubuntu.com/review
// @include     https://askubuntu.com/review/
// @version     1.1
// @grant       
// ==/UserScript==

var RS_reviews_avail = 0;

function RS_parseInt(string) {
    var got_decimal_point = false;
    var divider = 10;
    var result = 0;
    for (var i = 0; i < string.length; i++) {
        var char = string.substring(i,i+1);
        if (char >= '0' && char <= '9') {
            if (!got_decimal_point) {
                result *= 10;
                result += parseInt(char);
            } else {
                result += parseInt(char) / divider;
                divider *= 10;
            }
        } else if (char == ',') {
        } else {
            return -1;
        }
    }
    return result;
}

function RS_hasClass(element, cls) {
    return (' ' + element.className + ' ').indexOf(' ' + cls + ' ') > -1;
}

var RS_numbers = document.getElementsByClassName("dashboard-num");
for (var RS_i = RS_numbers.length - 1; RS_i >= 0; RS_i--) {
    if (!RS_hasClass(RS_numbers[RS_i].parentNode, "dashboard-faded")) {
        var int = RS_parseInt(RS_numbers[RS_i].getAttribute('title'));
        RS_reviews_avail += int;
    }
}

if (RS_reviews_avail) {
    window.setTimeout(function(){
        document.title = "(" + RS_reviews_avail + ") " + document.title;
    }, 300);
} else {
    window.setTimeout(function(){
        window.location = window.location;
    }, 15000);
}
5
  • I'm having trouble with userscripts.org, mind mirroring it? I've copy/pasted from source, but still.
    – jimsug
    May 17, 2014 at 19:14
  • userscripts.org seems to throw a nasty server error ("Web application could not be started"); am I doing something wrong?
    – Raphael
    Jun 5, 2014 at 7:32
  • Userscripts.org is dead, Jim. Better switch this to greasyfork.org Sep 8, 2014 at 10:25
  • This appears to use a decommissioned page structure (so it's broken). Is this still supported or should it be tagged as obsolete? Jan 10, 2019 at 5:01
  • 1
    @BrockAdams thanks for the notification. I don't have time to fix it at the moment and have also come to doubt the sustainability of this approach since putting it online, so I tagged it as obsolete.
    – user19139
    Jan 10, 2019 at 6:33

1 Answer 1

4

First of all, I like your script; it's nice and concise!

Just two small observations:

  1. It's incompatible with Google Chrome (unless Tampermonkey is installed) - due to the @require statement, requiring jQuery. You could rewrite the small bits of jQuery into vanilla JS to easily overcome this.

  2. When the review queues look like this:

    • Close Votes: 52.2k
    • First Posts: 10
    • Suggested Edits: 1

The window title shows (63), rather than (52.2k). This is because k is ignored when passed to parseInt().

1
  • 1
    Never mind. I fixed both things, thanks! The problem wasn't the K but a comma. The script gets the exact value from the title, but parseInt doesn't recognize the comma as a thousands delimiter. I updated the script. Thanks again for your comments!
    – user19139
    May 15, 2013 at 13:57

You must log in to answer this question.