Metafilter mark librarian contributions

By Plutor Last update May 8, 2008 — Installed 103 times. Daily Installs: 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1
// ==UserScript==
// @name           Metafilter mark librarian contributions
// @namespace      http://plutor.org/
// @description    Mark Jessamyn's colleagues' contributions on Metafilter
// @include        http://metafilter.com/*
// @include        http://*.metafilter.com/*
// ==/UserScript==

/* -- Configuration variables, sort of -------------------------------------- */

var showcontacts = 1;            // Boolean

var updateevery = 86400 * 1000;         // One day
var debug = 0;

var contactimg = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8%2F9hAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A%2FwD%2FoL2nkwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9gFBw8vA%2BfHrcEAAAIMSURBVDjLbZM9blRBEIS%2F7vfWuzKYRbKEbBkRQIJERIKQCEg4Aycw4jgkJFwAcQhERkJETAQEEPiHP6N989dF8N4aGzPJtDSt6qrqGmM6kgwEGOPNWAuwGHtw3Gz9uO6ACC0wdgzmExwSyAyTMLMJWpLiGDh27wOgj4jZz5OTB8%2Bev3i6ubXc6WZm%2FeZ1bGMLAY5ockzCy69h%2F%2FHDV4v5xktgBdCb2cbxt%2B%2F3Dg6PHt29cevK8uoSza6g%2FjKmmGgG5o2vX1erT18O3t6%2BudetJfSSrEOL9vv7%2FP3bN93W9ibd9n267Xto0o4FjpOGTf%2Fw8dBv39yzUwAzQwoiKjmC9EOwSLAUHg3oRikenJQZqAf81MQewMwoOdME5oU%2BVyyDYUDQEJ2MUhrQEDoPIIlSKrVWhNGnjOeGEaP3CI8g1UAIO7PGfl2kUihDplWw1UCfGxZTu4HRyEUTK%2F4nITGkRCkNHzJdCkwjWWE4otaGzNbxOS%2Bh1sKQBoLExirjQ2BnkukY0TSlVBcl1NrIZSBKoaWMZ%2BhsTOXoRIWIafg%2FACklSinklGklM0sF6t%2F8A3hAH04tXFij3H1w9xyheS7VrGWsJTza5LkIBQFRaz2noQfy7u7uuyf7%2B68PDg93UJhd2oPL6TTKa5%2BQhju3rn2W1M79xlrrwt13MeaGGWe2Pc4%2FNTOQHQNH7mPO%2FwDlpTq2DvtS9QAAAABJRU5ErkJggg%3D%3D";

/* -- Global variables ------------------------------------------------------ */

var clist = new Object();
var now = new Date();

/* -- Simple helper functions ----------------------------------------------- */

function mlc_get_cached_data() {
    try {
        clist = eval(GM_getValue("MefiLibrarians", ""));
    } catch(e) {
        GM_log("Error parsing cache");
        clist = new Object();
    }
}

function mlc_last_cache_update() {
    if (!clist) return 0;
    if (!clist.stamp) return 0;

    if (debug) GM_log("Last updated at " + clist.stamp, 0);
    return clist.stamp;
}

/* -- XMLHTTP request ------------------------------------------------------- */

function mlc_update_contact_list() {
    /* GET http://www.metafilter.com/usercontacts/USERID */
    var url = 'http://www.metafilter.com/usercontactsdata.mefi?user_id=292'; // Jessamyn
    if (debug) GM_log("Getting " + url, 0);

    GM_xmlhttpRequest({
        method: "GET",
        url:    url,
        onload: mlc_got_contact_list });
}

function mlc_got_contact_list(details) {
    if (details.readyState == 4 && details.status == 200) {
        var xml = new DOMParser().parseFromString(details.responseText, 'text/xml');
        mlc_handle_contact_list(xml);
    }
}

/* -- Creates the list from the contact list page --------------------------- */

function mlc_handle_contact_sublist(root, tagname) {
    var contacts = root.getElementsByTagName(tagname);

    if (contacts) {
        contacts = contacts[0].childNodes;

        for (var i=0; i<contacts.length; ++i) {
            var contact = contacts[i];
            if (contact.tagName && contact.tagName.toUpperCase() == 'USER') {
                var rel = '';
                var id = '';
                var name = ''
                var dist;
                try {
                    id = contact.getElementsByTagName('id')[0].childNodes[0].nodeValue;
                    name = contact.getElementsByTagName('username')[0].childNodes[0].nodeValue;
                } catch (e) {
                    // Can't find all the required bits
                    continue;
                }

                try {
                    rel = contact.getElementsByTagName('relationship')[0].childNodes[0].nodeValue;
                } catch(e) {}

                try {
                    dist = contact.getElementsByTagName('distance')[0].childNodes[0].nodeValue;
                } catch(e) {}


                // Toss out any non-collegues
                if (!rel.match(/colleague/)) {
                    continue;
                }

                var newc;
                if (clist.uid[id]) {
                    newc = clist.uid[id];
                    if (rel) newc.rel = rel;
                    if (dist) newc.dist = dist;
                } else {
                    newc = { id: id, name: name, rel: rel, dist: dist };
                }
                newc[tagname] = 1;
                clist.uid[id] = newc;
                clist.name[name] = newc;
            }
        }
    }
}

function mlc_handle_contact_list(xml) {
    var root = xml.documentElement;

    var numcontacts = 0;
    clist = { uid: {}, name: {} };
    
    mlc_handle_contact_sublist(root, 'contacts');

    /* Save */
    clist.stamp = now.valueOf();
    GM_setValue("MefiLibrarians", clist.toSource());

    /* Now mark contributions */
    mlc_mark_contribs();
}

/* -- Marks contribs from contacts  ----------------------------------------- */

var alreadymarked = 0;
function mlc_mark_contribs() {
    if (alreadymarked) return;
    var t0 = new Date();

    var userhrefre = new RegExp("^(http://(www\.)?metafilter\.com)?/user(\.mefi)?/");
    var usernamehrefre = new RegExp("(http://(www\.)?metafilter\.com)?/username.mefi/");

    for (var i in document.links) {
        var l = document.links[i];
        var lh = new String(l.href);
        var key = lh.substr(lh.lastIndexOf("/")+1);
        var obj = null;

        if (lh.match(userhrefre)) {
            obj = clist.uid[key];
        }
        else if (lh.match(usernamehrefre)) {
            obj = clist.name[key];
        }

        if (obj) {
            var ni = document.createElement("img");
            ni.src = contactimg;
            ni.title = 'This user is a librarian';
            ni.style.borderWidth = '0';
            l.parentNode.insertBefore(ni, l);
        }
    }

    alreadymarked = 1;
        if (debug) GM_log("Took " + (new Date() - t0) + "ms to mark");
}

/* -- Main ------------------------------------------------------------------ */

function mlc_init() {
    /* Get cached data */
    mlc_get_cached_data();

    var url = location.href;
    url = url.replace(/https?:\/\/([^\/]*\.)?metafilter.com/, '');

    if (now - mlc_last_cache_update() > updateevery) {
        /* Download page and update cache if it's old */
        mlc_update_contact_list();
    } else {
        /* Otherwise, just mark the contributions immediately */
        mlc_mark_contribs();
    }
}

/* DO IT */
mlc_init();