Monday, April 04, 2011 at 1:06 AM.
rssCloudSuite.receivePing
on receivePing (url, flLog) {
<<Changes
<<10/24/09; 10:02:38 AM by DW
<<Having a global minsecs proved too brutal for Lifeline feeds, which could easily change more often than every three minutes. So I set the default of the global minsecs to 0 and added a feed-level minsecs.
<<10/21/09; 10:59:58 PM by DW
<<Make sure ctsecs > 0.
<<"The server, rpc.rsscloud.org, returned error code 4: Can't accept the request because the minimum seconds between pings is 180 and you pinged us -955956556 seconds ago."
<<10/20/09; 1:29:05 PM by DW
<<Don't delete the changes table entry right after you inserted it (changes.xml was broken since October 2).
<<10/2/09; 10:33:05 AM by DW
<<Tweak the log message a bit.
<<9/4/09; 9:25:34 PM by DW
<<Eliminate other instances of the feed in the changes table.
<<7/12/09; 5:50:56 PM by DW
<<Call this when a feed you're maintaining has changed.
local (adrdata = rssCloudSuite.init (), adrfeed = rssCloudSuite.initFeed (url), now = clock.now (), startticks = clock.ticks ());
rssCloudSuite.checkEnabled (); //scripterror if not enabled
bundle { //10/21/09 by DW -- reject too-often pingers
local (minsecs = adrdata^.prefs.minSecsBetweenPings);
if adrfeed^.prefs.minSecsBetweenPings > minsecs { //10/24/09 by DW
minsecs = adrfeed^.prefs.minSecsBetweenPings};
if minsecs > 0 {
local (ctsecs = number (now - adrfeed^.whenLastCheck));
if ctsecs > 0 {
if ctsecs < minsecs {
scriptError ("Can't accept the request because the minimum seconds between pings is " + minsecs + " and you pinged us " + ctsecs + " seconds ago.")}}}};
adrfeed^.ctChecks++;
adrfeed^.whenLastCheck = now;
local (tc = clock.ticks ());
adrfeed^.ctTicksLastRead = clock.ticks () - tc;
local (s = tcp.httpreadurl (url, ctFollowRedirects:5));
local (hash = string.hashMD5 (s));
if adrfeed^.lastHash != hash {
adrfeed^.fldirty = true}
else {
if adrfeed^.lastSize != sizeof (s) {
adrfeed^.fldirty = true}};
adrfeed^.lastHash = hash;
adrfeed^.lastSize = sizeof (s);
if adrfeed^.fldirty {
thread.callscript (@rssCloudSuite.notifySubscribers, {nameof (adrfeed^)});
adrfeed^.ctUpdates++;
adrfeed^.whenLastUpdate = now};
bundle { //log the ping
if flLog {
local (feedinfo, feedlink);
rssCloudSuite.getFeedInfo (url, @feedinfo);
bundle { //set feedlink
if defined (feedinfo.title) {
feedlink = "The feed, <a href=\"" + url + "\">" + feedinfo.title + "</a>, "}
else {
feedlink = "This <a href=\"" + url + "\">feed</a>"}};
local (s = feedlink + " was said to have changed. We checked and the claim appears to be " + adrfeed^.fldirty + ".");
log2.add (rssCloudInfo.name, "Ping", s, startticks)}};
bundle { //push it on the changes table, 9/4/09 by DW
local (adrdata = rsscloudsuite.init ());
local (adrchange = @adrdata^.changes.[string.padwithzeros (++adrdata^.stats.ctChanges, 8)]);
new (tabletype, adrchange);
adrchange^.name = string (adrdata^.stats.ctChanges);
adrchange^.when = now;
adrchange^.url = url;
bundle { //remove other instances of the feed in the changes table
local (i, adr);
for i = sizeof (adrdata^.changes) downto 1 {
adr = @adrdata^.changes [i];
if adr^.url == url {
if adr != adrchange { //10/20/09 by DW
delete (adr)}}}};
adrdata^.stats.flChangesDirty = true};
adrfeed^.fldirty = false;
return (true)};
bundle { //test code
receivePing ("http://scripting.com/rss.xml", true)}
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.