Twitter Notifier

By Ikaros Uploaded May 30, 2009
/*
    @author: Ikaros
    @url: http://userscripts.org/jetpacks/13
    @update: http://userscripts.org/jetpacks/13.js
    @title: Twitter Notifier
    @description: Displays Twitter notifications about every minute with the most recent tweet from your friends timeline ("wall").
    @version: 0.3
*/

function TwitterNotifier() {
    self = this;
    
    self.update(); // initial update
        
    setInterval(function() { 
        self.update(); // update it
    }, 60000); // every 60 seconds (60 * 1000 milliseconds)
}

TwitterNotifier.prototype = {
	openTwitter: function() {        
        jetpack.tabs.open(this.twitterUrl);
        jetpack.tabs[jetpack.tabs.length - 1].focus();
	}, 
    
    notify: function(body, title, icon) {
		jetpack.notifications.show({
			title: title,
			body: body,
			icon: icon
		});
	}, 
    
    update: function() {
        self = this;
        
        $.get(self.xmlUrl, function(xml) {
            var el = $(xml).find("text"); // get the tweets
            var al = $(xml).find("name"); // get the tweets' authors
            var il = $(xml).find("profile_image_url"); // get their profile pictures
            
            if (el) {
                var newTweet = el.get(0).textContent; // get the first (0th) tweet
                var author;
                var profilePic;
                
                if (al) {
                    author = al.get(0).textContent; // get the first author
                } else {
                    author = "Twitter"; // something went wrong, set to default
                }
                
                if (il) {
                    profilePic = il.get(0).textContent; // get the first profile picture
                } else {
                    profilePic = self.defaultProfile; // something went wrong, set to default
                }
                
                if (self.oldTweet != newTweet) {
                    self.notify(newTweet, author, profilePic);
                    self.oldTweet = newTweet;
                }
            } else {
                self.notify("Please login to Twitter", "Twitter Notifier"); // user hasn't logged into Twitter yet
            }
        });
    }, 
    oldTweet: null, 
    xmlUrl: "http://twitter.com/statuses/friends_timeline.xml",
    twitterUrl: "http://twitter.com/", 
    defaultProfilePic: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAACiFBMVEV9UTd9TzN9UDWDu/+Dvv+DvP99TzR9UDZ9UTZ9TjF9TjKDuf99TC59TS99TC2Dvf99UDR9V0KDuP99Ujl9TzJ9VT6Duv99Uzx9VT+DtPiAi6h9TTCCqeN9XEyCqOB+XE2CsPCDtvyAj7B+YVd/f5F+YlmAh6J9TjOCreuAjq5/d4GAkbSDtvuBmcJ+ZF2Ah6F9UjqAh6CBkbN+W0p9TjB+bW6Dv/9+ZmB+YFSDt/6Cs/aCsvSBmcSDsfKCq+eBlbt+YVaAiaaAhJt/gJR8TjGAhp9+aGWCqN99Z2J+X1OAja6CsfOCreqDr+2DuP59Uzt/d4B9X1ODs/V+bGx9YFR9XlGBnsx+Z2KCsfJ/eod+XlGAk7d8TS9+a2t9Sy2CodJ9XU9/fpCDtvp+XU9+Y1mBotR/bnB9WEaCr++BkrZ9X1J9W0qCqeF+cXZ/e4iBmMGBo9d/eYeBj7F/bW59WESCquWBlLp/gJKCsvV/bnF9VkCCpNd+YFV9WkiAhp59Ujt+ZmKAhJx+amd9VD2Bmsd/d4OBns5/g5mDt/1/h59+Y1qDtfp+WUd/dn99VUCCodN/iqd8TC2BmsaBoNF/d4KCpdp/cHZ9XU5+dX19WUZ/fY59TS5/fYx+bG2Bjq6Bns2DwP99V0OAjKmBlLt/c3qBncp/eIKCt/1/fo9+aWZ/e4p+ZV6AiqZ/cniDtfuAmsR+X1WDs/d9VD5/gJOCtfqBncuAiqiCtPeDsPGAnMp+WkmAiKKBkrWCp96AmcN+a2qBnMmCruyCsfCBptt/f49/fIuCtPl9Wkl+ZF6CruuCsvOBodR/eIN9VDx9V0SCtvt/bW9/c3t/b3N+Y1t9UTiAiqeCqOF+cXcHDNQ9AAACOElEQVR4Xu2SU9PkUBBAcxUObXy27bVt27Zt27Zt2/b+nd3cSWYzU/swT1u1VXOeutL3dKe7mvlnJEgAgU0UgYmPU+CEkV1npjfp1JqxxVfemh1A5DfuNn1APPWdHoRWrBzfO6cO+3pmaAUecn8RQBFKamq1AdCs1XbsG8RGBGiA5o46IVYQ8tuSAwDKoa5FjfEIiCSCzSdO6jFlKojuwrMFxpo0EI5BX9K+OwwLYv+WuEugHRqyYGHU8qB5OK61KkXEEZYOy0tpyHbOJMnd7OvW9yLPRa1gCr7AWf1Ue0wS8QwIh8l4oEuAQDcY1Q+FGoEdJqHFBlWYNgqP1tPPY8eVT5Ajkz8kTdZrhQrJkapTN2yejmeI8i+DlFnSbFmAc+biAoNWmGcxpkc6zK/GxdS2LUI3lwhyjaXLDuV4NWPDkhAuFnjFTluFVlMbrFlbVeaVhQ0b8abN2i3Zt+CtdmUqYZuUu0Ogu9hZb9wl94K7Mx179jIavPuIZb8QlgsPkh+HaTeuMK/8KAd5Xn9MqqsAWgH4feS4S+R4HupPnESnlKR42m0544TM2QA+F3OR4vkL6OIlJ7CaUy/j2itQLXT1mnT9RsMtcvuOieFZBQDl48iuNoby7t6770APSiK3x4GHjx67nzx9ZmcZ3lXZKEzKS3pCrxpe5zqq3rx9957VXhn7Id/PyTXFso8EUXAWpOsEwU+fv3z9lgGZKOTXNF9Z9L0xxfNTOTsolApRs8WaKpD5v0mQ4BfrGmuJRpIi3QAAAABJRU5ErkJggg==", 
    twitterIcon: "data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAABMLAAATCwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATExMG5mZmnjJysy/4eLm1u7w89ru8PPa7/D02+Hi5dasrK2iNDQzKwAAAAAAAAAAAAAAAAAAAAAAAAAAYWFhNN/f4cb///////7y///22f//89P///PU///z0///+OH//////8jIybkgICAVAAAAAAAAAAAAAAAAZmZmJOvs7c7///3//+u4//3Ygf/81HP//NRz//zUc//81HH//NV1///wyP/6/P/6fHx8TwAAAAAAAAAAAAAAAMnJypT//////uar//zSbP/8027//NNu//zSbf/80m3//NJt//zQZP//5af/+/z9/5ycnV4AAAAAAAAAAHJyciP4+f3h//TW//zTcv/803D//NNx//3YgP/93Iz//dyL//3bif/93ZL///jf//n6/edvb28xAAAAAAAAAACkpaVK+vr8+f/or//80mz//NNu//3dkf//9+f///34///89v///Pb///35//r7/O7FxsZuAAAAAAAAAAAAAAAAsrO0Vvn5+fz/5qb//NJs//zSbf/96rn////////////////////////////BwcKvNDQ0FwAAAAAAAAAAAAAAALCxsVb5+fr8/+an//zSbP/8027//eeu//767//++Ov//vjq//746v///PP/+fn6+6Kio5kTExMLAAAAAAAAAACwsbFW+fn6/P/mp//80m3//NRy//zWef/82ID//Nh///zYf//8133//dqF///22P/3+Pvzb29vRAAAAAAAAAAAsLGxVvn5+vz/5qf//NJt//zUc//81HH//NNu//zTbv/8027//NNu//zPZP//5aX//Pz9/5eXmGAAAAAAAAAAALCxsVb5+fr8/+an//zSbf/81HP//NV1//zWeP/81nj//NZ4//zVdv/8133///PQ//n6/fKGhoY/AAAAAAAAAACwsbFW+fn6/P/mp//80mz//NNu//zkqP//9uH///jh///23///9t7///vs///////S0tOTW1tbBAAAAAAAAAAAsrO0V/r6+v3/5aX//NFp//zRav/+6rn//P7//e7w88T19vmv8/T3s+zt767Y2Nltg4ODDQAAAAAAAAAAAAAAAKampj79/v/z/+/H//zUc//81nv///bb//P0+OSHh4gsAAAAAODg4AbFxcUEAAAAAAAAAAAAAAAAAAAAAAAAAABTU1MI7e3upf//////99////nk///////Dw8OFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJOTkxfW19eI5+nszujp7Mnb29t1dnZ2DAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8AMAwOABAMDAAWxpwAE+CoABICCAAyAggAMgIIABICCAASAggAEgIIABICCAASAggAMgIIBPICCA/yAgwP8gIA=="
}

jetpack.statusBar.append({ 
    html: <>
        <div style="position: absolute; width: 100%; height: 100%; text-align: center; padding-top: 2px; cursor: pointer;">
            <img id="twitterIcon" />
        </div>
    </>, 
    width: 24, 
    onReady: function(doc) { 
        var twitNot = new TwitterNotifier();
        $("img#twitterIcon", doc).attr("src", twitNot.twitterIcon); // set the statusbar icon
        $(doc).click(function() { twitNot.openTwitter(); }); // open Twitter home when clicked
    }
});