2 // @name Metafilter mark librarian contributions
3 // @namespace http://plutor.org/
4 // @description Mark Jessamyn's colleagues' contributions on Metafilter
5 // @include http://metafilter.com/*
6 // @include http://*.metafilter.com/*
9 /* -- Configuration variables, sort of -------------------------------------- */
11 var showcontacts = 1; // Boolean
13 var updateevery = 86400 * 1000; // One day
16 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";
18 /* -- Global variables ------------------------------------------------------ */
20 var clist = new Object();
23 /* -- Simple helper functions ----------------------------------------------- */
25 function mlc_get_cached_data() {
27 clist = eval(GM_getValue("MefiLibrarians", ""));
29 GM_log("Error parsing cache");
34 function mlc_last_cache_update() {
36 if (!clist.stamp) return 0;
38 if (debug) GM_log("Last updated at " + clist.stamp, 0);
42 /* -- XMLHTTP request ------------------------------------------------------- */
44 function mlc_update_contact_list() {
45 /* GET http://www.metafilter.com/usercontacts/USERID */
46 var url = 'http://www.metafilter.com/usercontactsdata.mefi?user_id=292'; // Jessamyn
47 if (debug) GM_log("Getting " + url, 0);
52 onload: mlc_got_contact_list });
55 function mlc_got_contact_list(details) {
56 if (details.readyState == 4 && details.status == 200) {
57 var xml = new DOMParser().parseFromString(details.responseText, 'text/xml');
58 mlc_handle_contact_list(xml);
62 /* -- Creates the list from the contact list page --------------------------- */
64 function mlc_handle_contact_sublist(root, tagname) {
65 var contacts = root.getElementsByTagName(tagname);
68 contacts = contacts[0].childNodes;
70 for (var i=0; i<contacts.length; ++i) {
71 var contact = contacts[i];
72 if (contact.tagName && contact.tagName.toUpperCase() == 'USER') {
78 id = contact.getElementsByTagName('id')[0].childNodes[0].nodeValue;
79 name = contact.getElementsByTagName('username')[0].childNodes[0].nodeValue;
81 // Can't find all the required bits
86 rel = contact.getElementsByTagName('relationship')[0].childNodes[0].nodeValue;
90 dist = contact.getElementsByTagName('distance')[0].childNodes[0].nodeValue;
94 // Toss out any non-collegues
95 if (!rel.match(/colleague/)) {
101 newc = clist.uid[id];
102 if (rel) newc.rel = rel;
103 if (dist) newc.dist = dist;
105 newc = { id: id, name: name, rel: rel, dist: dist };
108 clist.uid[id] = newc;
109 clist.name[name] = newc;
115 function mlc_handle_contact_list(xml) {
116 var root = xml.documentElement;
119 clist = { uid: {}, name: {} };
121 mlc_handle_contact_sublist(root, 'contacts');
124 clist.stamp = now.valueOf();
125 GM_setValue("MefiLibrarians", clist.toSource());
127 /* Now mark contributions */
131 /* -- Marks contribs from contacts ----------------------------------------- */
133 var alreadymarked = 0;
134 function mlc_mark_contribs() {
135 if (alreadymarked) return;
138 var userhrefre = new RegExp("^(http://(www\.)?metafilter\.com)?/user(\.mefi)?/");
139 var usernamehrefre = new RegExp("(http://(www\.)?metafilter\.com)?/username.mefi/");
141 for (var i in document.links) {
142 var l = document.links[i];
143 var lh = new String(l.href);
144 var key = lh.substr(lh.lastIndexOf("/")+1);
147 if (lh.match(userhrefre)) {
148 obj = clist.uid[key];
150 else if (lh.match(usernamehrefre)) {
151 obj = clist.name[key];
155 var ni = document.createElement("img");
157 ni.title = 'This user is a librarian';
158 ni.style.borderWidth = '0';
159 l.parentNode.insertBefore(ni, l);
164 if (debug) GM_log("Took " + (new Date() - t0) + "ms to mark");
167 /* -- Main ------------------------------------------------------------------ */
169 function mlc_init() {
170 /* Get cached data */
171 mlc_get_cached_data();
173 var url = location.href;
174 url = url.replace(/https?:\/\/([^\/]*\.)?metafilter.com/, '');
176 if (now - mlc_last_cache_update() > updateevery) {
177 /* Download page and update cache if it's old */
178 mlc_update_contact_list();
180 /* Otherwise, just mark the contributions immediately */