// Read my friendfeed items and spew them onto the page
goog.provide('lahosken.ffhello.send');
goog.require('goog.array');
goog.require('goog.dom');
goog.require('goog.events');
goog.require('goog.events.EventType');
goog.require('goog.net.Jsonp');
// Ask friendfeed to send us some awesome data via JSON request
lahosken.ffhello.send = function() {
var jsonp = new goog.net.Jsonp(
'http://friendfeed.com/api/feed/user/lahosken');
var payload = { 'format': 'json' };
jsonp.send(payload,
lahosken.ffhello.handleResponse_,
lahosken.ffhello.handleError_);
};
// This utility function returns a paragraph node based on one
// "entry" from the friendfeed stream. Kind of an ugly mess of
// if/else; might be a smart way to straighten it up...
lahosken.ffhello.createDomlet_ = function(entry) {
var p = goog.dom.createDom('p');
if (entry.service.id == 'twitter') {
if (entry.title[0] == '@') { return null; }
goog.dom.appendChild(p, goog.dom.createTextNode(entry.title + ' '));
goog.dom.appendChild(p,
goog.dom.createDom('a', {'href': 'http://twitter.com/lahosken'}, '>'));
} else if (entry.service.id == 'blog') {
goog.dom.appendChild(p, goog.dom.createTextNode(entry.title + ' '));
goog.dom.appendChild(p,
goog.dom.createDom('a', {'href': entry.link}, '>'));
} else if (entry.service.id == 'googlereader') {
goog.dom.appendChild(p, goog.dom.createDom('b', {}, 'Link: '));
goog.dom.appendChild(p, goog.dom.createTextNode(entry.title + ' '));
goog.array.forEach(entry.comments, function(comment) {
if (comment.user && comment.user.nickname && comment.body &&
comment.user.nickname == 'lahosken') {
goog.dom.appendChild(p, goog.dom.createDom('b', {},
comment.body + ' '));
}});
goog.dom.appendChild(p, goog.dom.createDom('a', {'href': entry.link}, '>'));
} else {
goog.dom.appendChild(p, goog.dom.createTextNode(entry.title + ' '));
goog.dom.appendChild(p,
goog.dom.createDom('a', {'href': entry.link}, '>'));
}
return p;
};
// Callback function: if we get a response from friendfeed, this function
// handles it. A friendfeed response should look like an object that
// has a field 'entries', where 'entries' is a list of objects. Each
// entry corresponds to one friendfeed item.
//
// This function creates a bunch of DOM and inserts it into the document
// at a place marked by the page author with id "putff".
lahosken.ffhello.handleResponse_ = function(response) {
if (!response || !response.entries || !response.entries.length) { return; }
var put = goog.dom.getElement('putff'); // find place to insert DOM
if (!put) { return; } // if not found, give up
// for each entry, create a "domlet", a little bit of DOM, or null,
// if there was nothing useful.
var domlets = goog.array.map(response.entries,
lahosken.ffhello.createDomlet_);
// add the domlets to the document:
goog.array.reduce(domlets, function(parent, domlet) {
if (domlet) { goog.dom.appendChild(parent, domlet); }
return parent;
}, put);
};
// Something went wrong; we didn't get a good response from Friendfeed.
// Fall back gracefully. OK, fall back anyhow...
lahosken.ffhello.handleError_ = function(payload) {
// Give up or try again? I don't know. Flip a coin.
if (Math.random() > 0.5) {
return;
}
lahosken.ffhello.send_();
};
// When we compile our code, the compiler will scrunch our function names
// down to space-saving things like "g"...and that name might change each
// time we compile. We want page authors to be able to invoke the send
// function, so export it as "FFFetch":
goog.exportSymbol('FFFetch', lahosken.ffhello.send);
![[^]](../../../images/end.gif)