Monday, November 08, 2010 at 12:01 AM.
system.verbs.apps.FriendFeed.getRealTimeUpdates
on getRealTimeUpdates (username=nil, remotekey=nil, adrcallback=nil, room=nil) { <<Changes <<2/2/09; 9:31:33 AM by DW <<Don't fail if the result from FF is not a feed. <<1/24/09; 5:09:51 PM by DW <<New optional parameter, room -- if specified we get realtime updates for a room. <<10/21/08; 4:25:08 PM by DW <<Glue for FriendFeed's new realtime API. local (baseurl = "http://chan.friendfeed.com/api/updates"); friendfeed.init (); bundle { //set defaults if username == nil { username = user.friendfeed.prefs.username}; if remotekey == nil { remotekey = string (user.friendfeed.prefs.remotekey)}}; on httpClient (url, adrparams) { local (urllist = string.urlsplit (url), path = urllist [3], adr); bundle { //add params to the path path = path + "?"; for adr in adrparams { path = path + nameof (adr^) + "=" + adr^ + "&"}; path = string.delete (path, sizeof (path), 1)}; local (tc = clock.ticks (), timeoutticks = 60 * user.FriendFeed.prefs.timeoutsecs); local (s = string.httpResultSplit (tcp.httpClient (server:urllist [2], path:path, username:username, password:remotekey, timeoutticks:timeoutticks, flmessages:false, data:" "))); <<wp.newtextobject (s, @scratchpad.friendfeedresult) return (s)}; local (params); on gettoken (adrstruct) { local (adrfeed = xml.getaddress (adrstruct, "feed")); local (adrupdate = xml.getaddress (adrfeed, "update")); return (xml.getvalue (adrupdate, "token"))}; bundle { //get params local (xstruct); new (tabletype, @params); params.format = "xml"; local (s = httpclient (baseurl, @params)); xml.compile (s, @xstruct); <<scratchpad.xstruct = xstruct params.token = gettoken (@xstruct); <<dialog.alert (token) params.timeout = user.FriendFeed.prefs.timeoutsecs / 2}; loop { local (url); bundle { //set url, 1/24/09 by DW if room == nil { url = baseurl + "/home"} else { url = baseurl + "/room/" + room}}; local (s = httpclient (url, @params), xstruct); xml.compile (s, @xstruct); <<scratchpad.xstruct = xstruct params.token = gettoken (@xstruct); try { //2/2/09 by DW -- changed from "bundle" local (adrfeed = xml.getaddress (@xstruct, "feed"), adrentry=nil); try { adrentry = xml.getaddress (adrfeed, "entry")}; <<scratchpad.entry = adrentry^ if (adrcallback != nil) and (adrentry != nil) { adrcallback^ (adrentry)}}}} <<bundle //test code <<local (username = user.friendfeed.prefs.username, remotekey = user.friendfeed.prefs.remotekey) <<local (adroutline = @scratchpad.realtimeupdates) <<new (outlinetype, adroutline) <<edit (adroutline) <<on callback (adrentry) <<local (title = xml.getvalue (adrentry, "title")) <<local (oldtarget = target.set (adroutline)) <<op.insert (title, down) <<target.set (oldtarget) <<getRealTimeUpdates (username, remotekey, adrcallback:@callback, room:"instant-outline-beta")
This listing is for code that runs in the OPML Editor environment. I created these listings because I wanted the search engines to index it, so that when I want to look up something in my codebase I don't have to use the much slower search functionality in my object database. Dave Winer.