Monday, November 08, 2010 at 12:05 AM.
system.verbs.builtins.radio.thread.agents.pingCloud
on pingCloud () {
<<Changes
<<9/15/03; 6:10:46 PM by JES
<<Send comment notification prefs to the comments server if the feature is supported.
<<7/22/03; 5:07:00 PM by JES
<<Save weblogData.prefs.trackbackPageUrl in the cloud. Used when setting up a new Radio installation for an existing user. See radio.cloud.registerWithServer under the else block with the comment "connect existing user".
<<12/9/02; 2:15:09 PM by JES
<<Save weblogData.prefs.commentsPageUrl in the cloud. Used when setting up a new Radio installation for an existing user. See radio.cloud.registerWithServer under the else block with the comment "connect existing user".
<<8/31/02; 2:19:48 AM by JES
<<Update radio.data.cloudUrls.themesDirectoryOpml if sent from the server.
<<8/30/02; 5:31:54 PM by JES
<<Add information about the community server's search features or lack thereof to the radio.data.myCommunity table.
<<8/30/02; 12:15:51 AM by JES
<<Respect radio.data.myCommunity.minutesBetweenPings, if defined. This value is sent by RCS as part of the return struct for the getServerCapabilities call, based on a server-side pref. The default is 5 minutes.
<<Changes before 8/1/02
<<7/20/02; 5:11:04 PM by JES
<<If the getServerCapabilities return struct contains urlStore, set radio.data.cloudUrls.store to its value.
<<5/15/02; 3:18:43 PM by JES
<<If the getServerCapabilities return struct contains urlViewDirectory, set radio.data.cloudUrls.viewDirectoryUrl to its value.
<<3/14/02; 3:05:10 PM by JES
<<In the getServerCapabilities return-struct, it's mailListUrl, not mailList. Commented out debugging code.
<<3/14/02; 2:47:02 PM by JES
<<Set the systemUrls for the discussion group and mailing list, if present in the getServerCapabilities return-struct.
<<3/14/02; 2:36:56 PM by JES
<<If the struct returned by the getServerCapabilities call includes the constants in radio.data.myCommunity, patch their values.
<<3/7/02; 11:13:45 AM by JES
<<Get the cloud info table from user.radio.prefs.defaultCloud, instead of from the upstream spec.
<<3/3/02; 7:25:05 PM by JES
<<Only set the weblog changesXml url and hotlistOpml url, if they're defined in the staticUrls sub-table returned by getServerCapabilities.
<<3/2/02; 3:38:29 PM by JES
<<The name of the weblog updates changes xml url, returned by getServerCapabilities, changed to changesXml. Added setting of the hotlist opml url, as returned by getServerCapabilities.
<<3/1/02; 3:47:08 PM by JES
<<Added weblogTitle to the info table sent to the cloud with a ping.
<<3/1/02; 1:58:16 PM by JES
<<If the weblog updates url is included in the server capabilities response, set the url in radio.data.cloudLinks.
<<3/1/02; 1:04:55 PM by JES
<<The name of the weblog updates changes url returned by the getServerCapabilities call has changed from changes.xml to changes.
<<2/26/02; 11:28:22 AM by JES
<<Copy URLs from the staticUrls table in the server capabilities return value, if present, to their respective locations. Right now, there's only one -- the updated weblogs changes.xml.
<<2/25/02; 7:18:14 PM by JES
<<Copy various URLs returned from the getServerCapabilities call to their proper locations.
<<Dave rewrote this routine. Original code is below:
<<if not tcp.isOffline ()
<<local (now = clock.now (), flping = false)
<<bundle //make sure system values are initialized
<<if not defined (system.temp.radio.misc.lastPingTime)
<<system.temp.radio.misc.lastPingTime = date (0)
<<if not defined (system.temp.radio.misc.lastTcpAddress)
<<system.temp.radio.misc.lastTcpAddress = 0
<<if (now - system.temp.radio.misc.lastPingTime) >= (5 * 60)
<<flping = true
<<system.temp.radio.misc.lastPingTime = now
<<if system.temp.radio.misc.lastTcpAddress != tcp.myAddress ()
<<flping = true
<<system.temp.radio.misc.lastTcpAddress = tcp.myAddress ()
<<if flping
<<local (usernum = user.radio.prefs.usernum)
<<local (password = user.radio.prefs.passwords.default)
<<local (info)
<<bundle //set up the info table
<<new (tabletype, @info)
<<info.flBehindFirewall = user.radio.prefs.flBehindFirewall
<<info.serialNumber = user.radio.prefs.serialNumber
<<info.name = user.prefs.name
<<info.email = user.prefs.mailAddress
<<info.organization = user.prefs.organization
<<bundle //add the home page url to the info table
<<local (usernumstring = string.padwithzeros (user.radio.prefs.usernum, 7))
<<local (homeurl = "http://radio.weblogs.com/" + usernumstring + "/")
<<bundle //calculate homeurl
<<local (upstreamSpecPath = user.radio.prefs.upstream.folder + radio.data.fileNames.upstreamFileName)
<<if file.exists (upstreamSpecPath)
<<local (adrfile, adrspec)
<<if radio.file.getFileAttributes (upstreamSpecPath, @adrfile)
<<if radio.upstream.getUpstreamSpec (adrfile, @adrspec)
<<case string.lower (adrspec^.type)
<<"xmlstoragesystem"
<<local (adrcapabilities = @user.radio.prefs.upstream.servers.[adrspec^.server])
<<if not defined (adrcapabilities^)
<<radio.upstream.getServerCapabilities (adrspec)
<<homeurl = adrcapabilities^.serverCapabilities.yourUpstreamFolderUrl
<<"ftp"
<<homeurl = adrspec^.url
<<local (adrfolder = @user.radio.settings.files.[user.radio.prefs.upstream.folder])
<<if adrfolder^.upstream.url != ""
<<homeurl = adrfolder^.upstream.url
<<info.url = homeurl
<<info.organization = user.prefs.organization
<<if not user.radio.settings.flPasswordStoredInCloud
<<info.passwordFull = string (user.radio.prefs.passwords.default)
<<if xmlStorageSystem.ping (usernum, password, 0, @info, @user.radio.prefs.defaultCloud, adrclouddata:@user.radio.prefs.defaultCloudData)
<<if not user.radio.settings.flPasswordStoredInCloud
<<user.radio.settings.flPasswordStoredInCloud = true
<<bundle //get server capabilities, 2/7/02; 12:33:20 PM by DW
<<local (adrserverinfo = @user.radio.prefs.upstream.servers.[user.radio.prefs.defaultCloud.server])
<<local (adrcapabilities = @adrserverinfo^.serverCapabilities)
<<xmlStorageSystem.getServerCapabilities (usernum, password, adrcapabilities, adrdata:@user.radio.prefs.defaultCloud, flMessages:false)
<<2/25/02; 1:42:53 PM by JES
<<Get the server information from the usptream spec, instead of from user.radio.prefs.defaultCloud.
<<2/7/02; 12:20:26 PM by DW
<<In addition to pinging the cloud, also get the server capabilities.
<<1/25/02; 8:36:45 AM by DW
<<Update user's name, organization and email address on the community server.
<<12/10/01; 11:33:22 AM by JES
<<Get the homefolder url via the server capabilities for xss, or from the upstream spec for ftp, instead of from the filetable for the www folder. This fixes a bug where after you switch back from ftp to xss, your home link would still be the ftp link. Also, add user.prefs.organization to the info table sent to the cloud.
<<12/8/01; 4:30:43 PM by JES
<<Add the user's home folder url to the info table sent to the cloud.
<<12/3/01; 10:10:22 AM by DW
<<Transmit the serial number as part of the info table.
<<12/1/01; 11:37:52 AM by DW
<<Transmit the full password to the cloud once so that the cloud can send it back to the user when he or she installs a new version of Radio.
<<11/22/01; 8:24:44 PM by DW
<<Transmit the value of user.radio.prefs.flBehindFirewall to the cloud so it can percolate to P2P apps such as myWorkgroup.root.
<<11/22/01; 6:50:51 PM by DW
<<Save cloud data in user.radio.prefs.defaultCloudData.
<<11/20/01; 3:45:15 AM by JES
<<Changed user.radio.prefs.passwords.defaultXssPassword to user.radio.prefs.passwords.default.
<<10/16/01; 11:14:32 AM by DW
<<Created. Ping the cloud every five minutes, or when the user's IP address changes.
if not tcp.isOffline () {
local (flping = false, minutesBetweenPings = 5);
if defined (radio.data.myCommunity.minutesBetweenPings) {
minutesBetweenPings = radio.data.myCommunity.minutesBetweenPings};
if clock.timerExpired (this, 60 * minutesBetweenPings) {
flping = true}
else { //ping if IP address changed
local (myaddress = tcp.myAddress ());
if not defined (system.temp.radio.misc.lastTcpAddress) {
system.temp.radio.misc.lastTcpAddress = 0};
if system.temp.radio.misc.lastTcpAddress != myaddress {
system.temp.radio.misc.lastTcpAddress = myaddress;
flping = true}};
if flping {
local (adrblog = radio.weblog.init ());
local (info, clouddata);
bundle { //set up the info table
new (tabletype, @info);
info.flBehindFirewall = user.radio.prefs.flBehindFirewall;
info.serialNumber = user.radio.prefs.serialNumber;
info.name = user.prefs.name;
info.email = user.prefs.mailAddress;
info.organization = user.prefs.organization;
bundle { //add the weblog title and commentsPageUrl to the info table
info.weblogTitle = adrblog^.prefs.title;
info.commentsPageUrl = adrblog^.prefs.commentsPageUrl;
info.trackbackPageUrl = adrblog^.prefs.trackback.trackbackPageUrl};
bundle { //add the home page url to the info table
local (adrfolder = @user.radio.settings.files.[user.radio.prefs.upstream.folder]);
if adrfolder^.upstream.url != "" {
info.url = adrfolder^.upstream.url}};
if not user.radio.settings.flPasswordStoredInCloud {
info.passwordFull = string (user.radio.prefs.passwords.default)}};
bundle { //set up the clouddata table
<<bundle //code broken for FTP users
<<new (tableType, @clouddata)
<<local (fupstream = user.radio.prefs.wwwFolder + radio.data.filenames.upstreamFileName)
<<local (adrfile, adrspec)
<<radio.file.getFileAttributes (fupstream, @adrfile)
<<radio.upstream.getUpstreamSpec (adrfile, @adrspec)
<<clouddata.server = adrspec^.server
<<clouddata.port = adrspec^.port
<<clouddata.rpcPath = adrspec^.rpcPath
<<clouddata.protocol = adrspec^.protocol
<<clouddata.soapAction = adrspec^.soapAction
clouddata = user.radio.prefs.defaultCloud;
clouddata.fldebug = false};
if xmlStorageSystem.ping (user.radio.prefs.usernum, user.radio.prefs.passwords.default, 0, @info, @clouddata, adrclouddata:@user.radio.prefs.defaultCloudData) {
if not user.radio.settings.flPasswordStoredInCloud {
user.radio.settings.flPasswordStoredInCloud = true}};
bundle { //get server capabilities, 2/7/02; 12:33:20 PM by DW
local (adrserverinfo = @user.radio.prefs.upstream.servers.[user.radio.prefs.defaultCloud.server]);
if not defined (adrserverinfo^) {
new (tabletype, adrserverinfo)};
local (adrcapabilities = @adrserverinfo^.serverCapabilities);
xmlStorageSystem.getServerCapabilities (user.radio.prefs.usernum, user.radio.prefs.passwords.default, adrcapabilities, adrdata:@clouddata, flMessages:false);
adrserverinfo^.timeLastServerCapabilities = clock.now ();
bundle { //copy urls from the server to their proper locations
if defined (adrcapabilities^.urlRankingsByPageReads) {
radio.data.cloudUrls.rankings = adrcapabilities^.urlRankingsByPageReads};
if defined (adrcapabilities^.urlReferers) {
radio.data.cloudUrls.referers = adrcapabilities^.urlReferers};
if defined (adrcapabilities^.webBugUrl) {
radio.data.staticSiteStats.imgUrl = adrcapabilities^.webBugUrl};
if defined (adrcapabilities^.urlSpamFreeMailto) {
radio.data.cloudUrls.spamFreeMailto = adrcapabilities^.urlSpamFreeMailto};
if defined (adrcapabilities^.urlWeblogUpdates) {
radio.data.cloudUrls.weblogUpdates = adrcapabilities^.urlWeblogUpdates};
if defined (adrcapabilities^.weblogUpdates) {
user.radio.prefs.weblogUpdates.protocol = adrcapabilities^.weblogUpdates.protocol;
user.radio.prefs.weblogUpdates.server = adrcapabilities^.weblogUpdates.server;
user.radio.prefs.weblogUpdates.port = adrcapabilities^.weblogUpdates.port;
user.radio.prefs.weblogUpdates.rpcPath = adrcapabilities^.weblogUpdates.rpcPath};
if defined (adrcapabilities^.staticUrls) {
local (adrWeblogsComData = weblogsCom.init ());
if defined (adrcapabilities^.staticUrls.weblogUpdates) {
if defined (adrcapabilities^.staticUrls.weblogUpdates.changesXml) {
adrWeblogsComData^.prefs.changesUrl = adrcapabilities^.staticUrls.weblogUpdates.changesXml}};
if defined (adrcapabilities^.staticUrls.rssHotlist) {
if defined (adrcapabilities^.staticUrls.rssHotlist.hotlistOpml) {
radio.data.cloudUrls.hotlistOpml = adrcapabilities^.staticUrls.rssHotlist.hotlistOpml}}};
if defined (adrcapabilities^.urlViewDirectory) {
radio.data.cloudUrls.viewDirectoryUrl = adrcapabilities^.urlViewDirectory};
if defined (adrcapabilities^.urlStore) {
radio.data.cloudUrls.store = adrcapabilities^.urlStore}};
bundle { //copy community info to radio.data.myCommunity
if defined (adrcapabilities^.community) {
radio.data.myCommunity.name = adrcapabilities^.community.name;
radio.data.myCommunity.domainName = adrcapabilities^.community.domainName;
radio.data.myCommunity.flPublic = adrcapabilities^.community.flPublic;
radio.data.myCommunity.flCanHostComments = adrcapabilities^.community.flCanHostComments;
if defined (adrcapabilities^.community.flCanHostTrackback) {
radio.data.myCommunity.flCanHostTrackback = adrcapabilities^.community.flCanHostTrackback}
else {
radio.data.myCommunity.flCanHostTrackback = false};
if defined (adrcapabilities^.community.flHasSearch) {
radio.data.myCommunity.flHasSearch = adrcapabilities^.community.flHasSearch;
radio.data.myCommunity.searchPageUrl = adrcapabilities^.community.urlSearch}
else {
radio.data.myCommunity.flHasSearch = false;
radio.data.myCommunity.searchPageUrl = ""};
radio.data.systemUrls.discussionGroup = adrcapabilities^.community.discussionGroupUrl;
radio.data.systemUrls.mailList = adrcapabilities^.community.mailListUrl}};
if defined (adrcapabilities^.minutesBetweenPings) {
radio.data.myCommunity.minutesBetweenPings = adrcapabilities^.minutesBetweenPings};
if defined (adrcapabilities^.urlThemesDirectoryOpml) {
radio.data.cloudUrls.themesDirectoryOpml = adrcapabilities^.urlThemesDirectoryOpml}};
bundle { //send comment notification prefs
local (flSaveCommentPrefs = false);
bundle { //set flSaveCommentPrefs -- save once every 24 hours
if not defined (user.radio.stats.whenLastCommentPrefsSave) {
user.radio.stats.whenLastCommentPrefsSave = date (0)};
local (whenToSave = user.radio.stats.whenLastCommentPrefsSave + (24 * 3600) );
if clock.now () >= whenToSave {
flSaveCommentPrefs = true}};
if flSaveCommentPrefs {
try { //only try once per 24 hours
user.radio.stats.whenLastCommentPrefsSave = clock.now ();
local (adrfolder);
if radio.file.getFileAttributes (user.radio.prefs.wwwFolder, @adrfolder) {
local (adrspec);
if radio.upstream.getUpstreamSpec (adrfolder, @adrspec) {
local (server, port, path, method, sitename, data);
bundle { //get comment server RPC info
local (xtext = tcp.httpReadUrl (adrblog^.prefs.commentsPageUrl + "?c=getRpcInfo"));
local (xstruct);
xml.compile (xtext, @xstruct);
local (adrRpcInfo = xml.getAddress (@xstruct, "rpcInfo"));
server = xml.getValue (adrRpcInfo, "server");
port = number (xml.getValue (adrRpcInfo, "port"));
path = xml.getValue (adrRpcInfo, "path");
method = xml.getValue (adrRpcInfo, "methodName");
sitename = xml.getValue (adrRpcInfo, "siteName")};
bundle { //set up prefs table
new (tableType, @data);
new (tableType, @data.prefs);
data.prefs.flNotifyNewComments = adrblog^.prefs.flCommentNotificationEnabled;
data.prefs.sendNotificationTo = adrblog^.prefs.authorMailAddress;
new (tableType, @data.communityServer);
data.communityServer.server = adrspec^.server;
data.communityServer.port = adrspec^.port;
data.communityServer.methodName = "xmlStorageSystem.validateUser";
data.communityServer.rpcPath = adrspec^.rpcPath};
bundle { //make the RPC call to set the prefs
local (password = string.hashMd5 (string (user.radio.prefs.passwords.[adrspec^.passwordName])) );
local (params = {sitename, adrspec^.usernum, password, data});
xml.rpc (server, port, method, @params)}}}}}}}}} //returns false if there's an error
<<bundle //test code
<<system.temp.timers.[this] = date (0)
<<pingCloud ()
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.