Move all the exciting crossposting action to ljprotocol.pl, so that
everything that posts to Dreamwidth will go through the crossposting logic.
Patch by superliminal.
diffs (295 lines):
diff -r ba0755847a96 -r 1c0901cf5b11 cgi-bin/ljprotocol.pl
--- a/cgi-bin/ljprotocol.pl Wed Aug 05 09:56:59 2009 +0000
+++ b/cgi-bin/ljprotocol.pl Wed Aug 05 15:48:33 2009 +0000
@@ -982,6 +982,32 @@ sub common_event_validation
! LJ::Tags::is_valid_tagstring($req->{props}->{taglist});
return 1;
+}
+
+sub schedule_xposts
+{
+ my ($u, $ditemid, $deletep, $fn) = @_;
+ my @successes;
+ my @failures;
+ my @accounts = DW::External::Account->get_external_accounts($u);
+ foreach my $acct (@accounts) {
+ my ($xpostp, $info) = $fn->($acct);
+ if ($xpostp) {
+ my $sclient = LJ::theschwartz();
+ my $info = {uid => $u->userid,
+ accountid => $acct->acctid,
+ ditemid => $ditemid,
+ delete => $deletep,
+ %{$info}};
+ my $job =
TheSchwartz::Job->new_from_array('DW::Worker::XPostWorker', $info);
+ if ($sclient && $job && $sclient->insert($job)) {
+ push @successes, $acct;
+ } else {
+ push @failures, $acct;
+ }
+ }
+ }
+ return (\...@successes, \...@failures);
}
sub postevent
@@ -1498,6 +1524,10 @@ sub postevent
my $entry = LJ::Entry->new($uowner, jitemid => $jitemid, anum => $anum);
+ if (LJ::u_equals($u, $uowner) && $req->{xpost} ne '0') {
+ schedule_xposts($u, $ditemid, 0, sub { ((shift)->xpostbydefault, {})
});
+ }
+
# run local site-specific actions
LJ::run_hooks("postpost", {
'itemid' => $jitemid,
@@ -1548,6 +1578,8 @@ sub editevent
sub editevent
{
my ($req, $err, $flags) = @_;
+ my $res;
+ my $deleted = 0;
un_utf8_request($req);
return undef unless authenticate($req, $err, $flags);
@@ -1604,6 +1636,8 @@ sub editevent
"compressed, security, allowmask, year, month, day, ".
"rlogtime, anum FROM log2 WHERE journalid=$ownerid AND
jitemid=$itemid");
+ my $ditemid = $itemid * 256 + $oldevent->{anum};
+
($oldevent->{subject}, $oldevent->{event}) = $dbcm->selectrow_array
("SELECT subject, event FROM logtext2 ".
"WHERE journalid=$ownerid AND jitemid=$itemid");
@@ -1649,6 +1683,8 @@ sub editevent
# simple logic for deleting an entry
if (!$flags->{'use_old_content'} && $req->{'event'} !~ /\S/)
{
+ $deleted = 1;
+
# if their newesteventtime prop equals the time of the one they're
deleting
# then delete their newesteventtime.
if ($u->{'userid'} == $uowner->{'userid'}) {
@@ -1664,7 +1700,7 @@ sub editevent
# delete is initiated.
$uowner->log_event('delete_entry', {
remote => $u,
- actiontarget => ($req->{itemid} * 256 + $oldevent->{anum}),
+ actiontarget => $ditemid,
method => 'protocol',
})
unless $flags->{noauth};
@@ -1675,9 +1711,8 @@ sub editevent
# what they just deleted. (or something... probably rare.)
LJ::set_userprop($u, "dupsig_post", undef);
- my $res = { 'itemid' => $itemid,
- 'anum' => $oldevent->{'anum'} };
- return $res;
+ $res = {itemid => $itemid, anum => $oldevent->{anum}};
+ goto END;
}
# now make sure the new entry text isn't $CannotBeShown
@@ -1794,7 +1829,7 @@ sub editevent
LJ::mysqldate_to_time($eventtime, 1),
LJ::mysqldate_to_time($oldevent->{'logtime'}, 1),
$sec,
- $itemid*256 + $oldevent->{'anum'});
+ $ditemid);
LJ::MemCache::set([$ownerid, "log2:$ownerid:$itemid"], $row);
@@ -1875,7 +1910,7 @@ sub editevent
LJ::memcache_kill($ownerid, "dayct2");
- my $res = { 'itemid' => $itemid };
+ $res = {itemid => $itemid};
if (defined $oldevent->{'anum'}) {
$res->{'anum'} = $oldevent->{'anum'};
$res->{'url'} = LJ::item_link($uowner, $itemid, $oldevent->{'anum'});
@@ -1891,6 +1926,13 @@ sub editevent
LJ::run_hooks("editpost", $entry);
+ END:
+ my $xpost_string = $curprops{$itemid}->{xpost};
+ if ($xpost_string && LJ::u_equals($u, $uowner) && $req->{xpost} ne '0') {
+ my $xpost_info =
DW::External::Account->xpost_string_to_hash($xpost_string);
+ schedule_xposts($u, $ditemid, $deleted,
+ sub { ($xpost_info->{(shift)->acctid}, {}) });
+ }
return $res;
}
diff -r ba0755847a96 -r 1c0901cf5b11 htdocs/editjournal.bml
--- a/htdocs/editjournal.bml Wed Aug 05 09:56:59 2009 +0000
+++ b/htdocs/editjournal.bml Wed Aug 05 15:48:33 2009 +0000
@@ -205,6 +205,7 @@ body<=
'user' => $u->{'user'},
'usejournal' => $usejournal,
'itemid' => $itemid,
+ 'xpost' => '0'
);
LJ::entry_form_decode(\%req, \%POST);
@@ -242,46 +243,31 @@ body<=
# selected crosspost.
my $xpost_result = '';
if ($journalu == $remote && ($POST{prop_xpost_check} ||
$GET{prop_xpost_check})) {
- my @xpost_success;
- my @xpost_errors;
-
- # get the accounts for the user
- my @accounts =
DW::External::Account->get_external_accounts($remote);
- foreach my $acct(@accounts) {
- my $acctid = $acct->acctid;
- # see if we said to xpost to this account
- if ($POST{"prop_xpost_$acctid"} ||
$GET{"prop_xpost_$acctid"}) {
- # get the auth information
- my %auth;
- if ($POST{"prop_xpost_resp_$acctid"} ||
$GET{"prop_xpost_resp_$acctid"}) {
- $auth{auth_response} =
$POST{"prop_xpost_resp_$acctid"} || $GET{"prop_xpost_resp_$acctid"};
- $auth{auth_challenge} =
$POST{"prop_xpost_chal_$acctid"} || $GET{"prop_xpost_chal_$acctid"};
- } else {
- $auth{password} =
$POST{"prop_xpost_password_$acctid"} || $GET{"prop_xpost_password_$acctid"};
- }
- # send this to theschwartz to crosspost
- my $sclient = LJ::theschwartz();
- my $job = TheSchwartz::Job->new_from_array(
- 'DW::Worker::XPostWorker', {
- 'uid' => $remote->userid,
- 'ditemid' => $ditemid,
- 'accountid' => $acctid,
- 'password' => $auth{password},
- 'auth_challenge' => $auth{auth_challenge},
- 'auth_response' => $auth{auth_response},
- 'delete' => $deleted } );
- # if we have a client and job, then request
- # the crosspost
- if ($sclient && $job && $sclient->insert($job)) {
- push @xpost_success, "<li>" .
BML::ml('xpost.request.success', {'account' => $acct->displayname}) . "</li>";
- } else {
- # one of them didn't work.
- push @xpost_errors, "<li><div style='color:
red;'><strong>" . BML::ml('xpost.request.failed', { 'account' =>
$acct->displayname, 'editurl' => $edititemlink }) . " </strong></div></li>";
- }
- }
- }
- $xpost_result .= join ("\n", @xpost_success);
- $xpost_result .= join ("\n", @xpost_errors);
+ my ($xpost_successes, $xpost_failures) =
+ LJ::Protocol::schedule_xposts($remote, $ditemid,
$deleted,
+ sub {
+ my $acctid =
(shift)->acctid;
+
($POST{"prop_xpost_$acctid"} || $GET{"prop_xpost_$acctid"},
+ {password =>
$POST{"prop_xpost_password_$acctid"}
+ ||
$GET{"prop_xpost_password_$acctid"},
+ auth_challenge =>
$POST{"prop_xpost_chal_$acctid"}
+
|| $GET{"prop_xpost_chal_$acctid"},
+ auth_response =>
$POST{"prop_xpost_resp_$acctid"}
+
|| $GET{"prop_xpost_resp_$acctid"}})
+ });
+ $xpost_result .= join("\n",
+ map {"<li>"
+ .
BML::ml('xpost.request.success',
+ {account =>
$_->displayname})
+ . "</li>"}
+ @{$xpost_successes});
+ $xpost_result .= join("\n",
+ map {"<li><div style='color:
red;'><strong>"
+ .
BML::ml('xpost.request.failed',
+ {account =>
$_->displayname,
+ 'editurl' =>
$edititemlink})
+ . " </strong></div></li>"}
+ @{$xpost_failures});
}
my $result = "<?h1 $ML{'.success.head'} h1?>";
diff -r ba0755847a96 -r 1c0901cf5b11 htdocs/update.bml
--- a/htdocs/update.bml Wed Aug 05 09:56:59 2009 +0000
+++ b/htdocs/update.bml Wed Aug 05 15:48:33 2009 +0000
@@ -375,6 +375,7 @@
'password' => $POST{'password'},
'usejournal' => $POST{'usejournal'},
'tz' => 'guess',
+ 'xpost' => '0'
);
LJ::entry_form_decode(\%req, \%POST);
@@ -445,48 +446,32 @@
# crosspost if we're posting to our own journal and have
# selected crosspost.
if ($ju == $remote && ($POST{prop_xpost_check} ||
$GET{prop_xpost_check})) {
- my @xpost_success;
- my @xpost_errors;
-
- # get the accounts for the user
- my @accounts =
DW::External::Account->get_external_accounts($remote);
- foreach my $acct(@accounts) {
- my $acctid = $acct->acctid;
- # see if we said to xpost to this account
- if ($POST{"prop_xpost_$acctid"} ||
$GET{"prop_xpost_$acctid"}) {
- # xpost to this account.
- my $result = {};
- my %auth;
- if ($POST{"prop_xpost_resp_$acctid"} ||
$GET{"prop_xpost_resp_$acctid"}) {
- $auth{auth_response} =
$POST{"prop_xpost_resp_$acctid"} || $GET{"prop_xpost_resp_$acctid"};
- $auth{auth_challenge} =
$POST{"prop_xpost_chal_$acctid"} || $GET{"prop_xpost_chal_$acctid"};
- } else {
- $auth{password} =
$POST{"prop_xpost_password_$acctid"} || $GET{"prop_xpost_password_$acctid"};
- }
- # send this to theschwartz to crosspost
- my $sclient = LJ::theschwartz();
- my $job = TheSchwartz::Job->new_from_array(
- 'DW::Worker::XPostWorker', {
- 'uid' => $remote->userid,
- 'ditemid' => $itemid,
- 'accountid' => $acctid,
- 'password' => $auth{password},
- 'auth_challenge' =>
$auth{auth_challenge},
- 'auth_response' =>
$auth{auth_response} });
- # if we have a client and job, then request
- # the crosspost
- if ($sclient && $job &&
$sclient->insert($job)) {
- push @xpost_success, "<li>" .
BML::ml('xpost.request.success', {'account' => $acct->displayname}) . "</li>";
- } else {
- # one of them didn't work.
- push @xpost_errors, "<li><div
style='color: red;'><strong>" . BML::ml('xpost.request.failed', { 'account' =>
$acct->displayname, 'editurl' => $edititemlink }) . " </strong></div></li>";
- }
- }
- }
-
+ my ($xpost_successes, $xpost_errors) =
+ LJ::Protocol::schedule_xposts($remote, $itemid, 0,
+ sub {
+ my $acctid =
(shift)->acctid;
+
($POST{"prop_xpost_$acctid"} || $GET{"prop_xpost_$acctid"},
+ {password =>
$POST{"prop_xpost_password_$acctid"}
+ ||
$GET{"prop_xpost_password_$acctid"},
+ auth_challenge
=> $POST{"prop_xpost_chal_$acctid"}
+
|| $GET{"prop_xpost_chal_$acctid"},
+ auth_response
=> $POST{"prop_xpost_resp_$acctid"}
+
|| $GET{"prop_xpost_resp_$acctid"}})
+ });
$$body .= "<ul>\n";
- $$body .= join ("\n", @xpost_success);
- $$body .= join ("\n", @xpost_errors);
+ $$body .= join("\n",
+ map { "<li>"
+ . BML::ml('xpost.request.success',
+ {account =>
$_->displayname})
+ . "</li>" }
+ @{$xpost_successes});
+ $$body .= join("\n",
+ map { "<li><div style='color:
red;'><strong>"
+ . BML::ml('xpost.request.failed',
+ {account =>
$_->displayname,
+ editurl =>
$edititemlink })
+ . " </strong></div></li>" }
+ @{$xpost_errors});
$$body .= "</ul>\n";
$$body .= "<br/>";
}
_______________________________________________
dw-changelog mailing list
[email protected]
http://lists.dwscoalition.org/mailman/listinfo/dw-changelog