mark: A photo of Mark kneeling on top of the Taal Volcano in the Philippines. It was a long hike. (Default)
Mark Smith ([staff profile] mark) wrote in [site community profile] changelog2009-08-25 11:15 pm

[dw-free] Add PubSubHubbub pinging support.

[commit: http://hg.dwscoalition.org/dw-free/rev/775ff749c945]

Add PubSubHubbub pinging support.

This patch was pulled from the LiveJournal.com repository.

Patch by [staff profile] mark.

Files modified:
  • bin/worker/ping-hubbub
  • cgi-bin/ljfeed.pl
  • cgi-bin/ljlib.pl
  • cgi-bin/ljprotocol.pl
  • cvs/multicvs.conf
  • doc/config-private.pl.txt
--------------------------------------------------------------------------------
diff -r 34b82504fb2d -r 775ff749c945 bin/worker/ping-hubbub
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bin/worker/ping-hubbub	Tue Aug 25 23:15:51 2009 +0000
@@ -0,0 +1,15 @@
+#!/usr/bin/perl
+
+use strict;
+use lib "$ENV{LJHOME}/cgi-bin";
+
+require 'ljlib.pl';
+
+use LJ::Worker::TheSchwartz;
+use TheSchwartz::Worker::PubSubHubbubPublish;
+
+schwartz_decl( "TheSchwartz::Worker::PubSubHubbubPublish" );
+schwartz_work();
+
+
+1;
diff -r 34b82504fb2d -r 775ff749c945 cgi-bin/ljfeed.pl
--- a/cgi-bin/ljfeed.pl	Tue Aug 25 18:26:14 2009 +0000
+++ b/cgi-bin/ljfeed.pl	Tue Aug 25 23:15:51 2009 +0000
@@ -293,7 +293,8 @@ sub create_view_rss
     # header
     $ret .= "<?xml version='1.0' encoding='$opts->{'saycharset'}' ?>\n";
     $ret .= LJ::run_hook("bot_director", "<!-- ", " -->") . "\n";
-    $ret .= "<rss version='2.0' xmlns:lj='http://www.livejournal.org/rss/lj/1.0/'>\n";
+    $ret .= "<rss version='2.0' xmlns:lj='http://www.livejournal.org/rss/lj/1.0/' " .
+            "xmlns:atom10='http://www.w3.org/2005/Atom'>\n";
 
     # channel attributes
     $ret .= "<channel>\n";
@@ -306,6 +307,12 @@ sub create_view_rss
     $ret .= "  <lj:journal>" . $u->user . "</lj:journal>\n";
     $ret .= "  <lj:journaltype>" . $u->journaltype_readable . "</lj:journaltype>\n";
     # TODO: add 'language' field when user.lang has more useful information
+
+    if ( LJ::is_enabled( 'hubbub' ) ) {
+        foreach my $hub (@LJ::HUBBUB_HUBS) {
+            $ret .= "  <atom10:link rel='hub' href='" . LJ::exml($hub) . "' />\n";
+        }
+    }
 
     ### image block, returns info for their current userpic
     if ($u->{'defaultpicid'}) {
@@ -408,7 +415,7 @@ sub create_view_atom
         my ( $rel, $type, $href, $title ) = @_;
         my $link = XML::Atom::Link->new( Version => 1 );
         $link->rel($rel);
-        $link->type($type);
+        $link->type($type) if $type;
         $link->href($href);
         $link->title( $title ) if $title;
         return $link;
@@ -473,6 +480,12 @@ sub create_view_atom
                 'Create a new entry'
             )
         ) if $opts->{'apilinks'};
+
+        if ( LJ::is_enabled( 'hubbub' ) ) {
+            foreach my $hub (@LJ::HUBBUB_HUBS) {
+                $feed->add_link($make_link->('hub', undef, $hub));
+            }
+        }
     }
 
     my $posteru = LJ::load_userids( map { $_->{posterid} } @$cleanitems);
@@ -1062,5 +1075,30 @@ sub create_view_comments
     return $ret;
 }
 
+sub generate_hubbub_jobs {
+    my ( $u, $joblist ) = @_;
+
+    return unless LJ::is_enabled( 'hubbub' );
+
+    foreach my $hub ( @LJ::HUBBUB_HUBS ) {
+        my $make_hubbub_job = sub {
+            my $type = shift;
+
+            my $topic_url = $u->journal_base . "/data/$type";
+            return TheSchwartz::Job->new(
+                funcname => 'TheSchwartz::Worker::PubSubHubbubPublish',
+                arg => {
+                    hub => $hub,
+                    topic_url => $topic_url,
+                },
+                coalesce => $hub,
+            );
+        };
+
+        push @$joblist, $make_hubbub_job->("rss");
+        push @$joblist, $make_hubbub_job->("atom");
+    }
+}
+
 
 1;
diff -r 34b82504fb2d -r 775ff749c945 cgi-bin/ljlib.pl
--- a/cgi-bin/ljlib.pl	Tue Aug 25 18:26:14 2009 +0000
+++ b/cgi-bin/ljlib.pl	Tue Aug 25 23:15:51 2009 +0000
@@ -2408,7 +2408,7 @@ sub is_enabled {
         my $remote = LJ::get_remote();
         return 1 if $remote && $remote->get_cap( 'beta_payments' );
     }
-    return ! LJ::conf_test($LJ::DISABLED{$conf}, @_);
+    return ! LJ::conf_test( $LJ::DISABLED{$conf}, @_ );
 }
 
 package LJ::CleanHTML;
diff -r 34b82504fb2d -r 775ff749c945 cgi-bin/ljprotocol.pl
--- a/cgi-bin/ljprotocol.pl	Tue Aug 25 18:26:14 2009 +0000
+++ b/cgi-bin/ljprotocol.pl	Tue Aug 25 23:15:51 2009 +0000
@@ -1526,7 +1526,7 @@ sub postevent
     # but still fire the logging events
     unless ( $flags->{nonotify} ) {
         push @jobs, LJ::Event::JournalNewEntry->new($entry)->fire_job;
-        push @jobs, LJ::Event::UserNewEntry->new($entry)->fire_job if ( LJ::is_enabled('esn-userevents') || $LJ::_T_FIRE_USERNEWENTRY );
+        push @jobs, LJ::Event::UserNewEntry->new($entry)->fire_job if LJ::is_enabled('esn-userevents') || $LJ::_T_FIRE_USERNEWENTRY;
         push @jobs, LJ::Event::OfficialPost->new($entry)->fire_job if $uowner->is_official;        
     }
     push @jobs, LJ::EventLogRecord::NewEntry->new($entry)->fire_job;
@@ -1535,6 +1535,9 @@ sub postevent
     if ( @LJ::SPHINX_SEARCHD ) {
         push @jobs, TheSchwartz::Job->new_from_array( 'DW::Worker::Sphinx::Copier', { userid => $uowner->id } );
     }
+
+    # PubSubHubbub Support
+    LJ::Feed::generate_hubbub_jobs( $uowner, \@jobs );
 
     my $sclient = LJ::theschwartz();
     if ($sclient && @jobs) {
@@ -1889,7 +1892,17 @@ sub editevent
         $sclient->insert_jobs( TheSchwartz::Job->new_from_array( 'DW::Worker::Sphinx::Copier', { userid => $ownerid } ) );
     }
 
-    LJ::run_hooks("editpost", $entry);
+    # PubSubHubbub Support
+    my @jobs;
+    LJ::Feed::generate_hubbub_jobs( $uowner, \@jobs );
+
+    LJ::run_hooks( "editpost", $entry, \@jobs );
+
+    my $sclient = LJ::theschwartz();
+    if ( $sclient && @jobs ) {
+        my @handles = $sclient->insert_jobs(@jobs);
+        # TODO: error on failure?  depends on the job I suppose?  property of the job?
+    }
 
     return $res;
 }
diff -r 34b82504fb2d -r 775ff749c945 cvs/multicvs.conf
--- a/cvs/multicvs.conf	Tue Aug 25 18:26:14 2009 +0000
+++ b/cvs/multicvs.conf	Tue Aug 25 23:15:51 2009 +0000
@@ -35,6 +35,7 @@ SVN(Test-FakeApache)      = http://code.
 SVN(Test-FakeApache)      = http://code.livejournal.org/svn/Test-FakeApache/trunk/
 SVN(LJ-UserSearch)        = http://code.livejournal.org/svn/LJ-UserSearch/trunk/
 SVN(TheSchwartz-Worker-SendEmail) = http://code.livejournal.org/svn/TheSchwartz-Worker-SendEmail/trunk/
+SVN(hubbub)               = http://pubsubhubbub.googlecode.com/svn/trunk/publisher_clients/
 
 dw-free                                   .
 
@@ -77,6 +78,9 @@ memcached/api/perl/lib/                 
 
 ddlockd/api/perl/DDLockClient.pm              cgi-bin/DDLockClient.pm
 ddlockd/server/ddlockd                        bin/ddlockd
+
+hubbub/perl/lib/Net/PubSubHubbub/Publisher.pm cgi-bin/Net/PubSubHubbub/Publisher.pm
+hubbub/perl-schwartz/lib/TheSchwartz/Worker/PubSubHubbubPublish.pm  cgi-bin/TheSchwartz/Worker/PubSubHubbubPublish.pm
 
 mogilefs/api/perl/MogileFS-Client/lib         cgi-bin
 mogilefs/utils/mogadm                         bin/mogadm
diff -r 34b82504fb2d -r 775ff749c945 doc/config-private.pl.txt
--- a/doc/config-private.pl.txt	Tue Aug 25 18:26:14 2009 +0000
+++ b/doc/config-private.pl.txt	Tue Aug 25 23:15:51 2009 +0000
@@ -98,6 +98,12 @@
     # lazy in their typing.  For example, leave off the trailing slash (/bots
     # instead of /bots/) if your URI is a directory.
     #$BLOCKED_BOT_URI = '/bots';
+
+    # If you wish to publish PubSubHubbub notifications, uncomment this.  You can
+    # use this default hub location, as it's supported by Google, or you can run
+    # your own (or use any other hub you want).
+    # @HUBBUB_HUBS = ( 'http://pubsubhubbub.appspot.com/' );
+
 }
 
 {
--------------------------------------------------------------------------------