Merge branch 'master' into 0.9.x

This commit is contained in:
Brion Vibber 2011-02-25 12:24:18 -08:00
commit 880b1b666e
5 changed files with 133 additions and 28 deletions

View File

@ -118,11 +118,13 @@ class BackupaccountAction extends Action
{ {
$cur = common_current_user(); $cur = common_current_user();
$stream = new UserActivityStream($cur); $stream = new UserActivityStream($cur, true, UserActivityStream::OUTPUT_RAW);
header('Content-Disposition: attachment; filename='.$cur->nickname.'.atom'); header('Content-Disposition: attachment; filename='.$cur->nickname.'.atom');
header('Content-Type: application/atom+xml; charset=utf-8'); header('Content-Type: application/atom+xml; charset=utf-8');
// @fixme atom feed logic is in getString...
// but we just want it to output to the outputter.
$this->raw($stream->getString()); $this->raw($stream->getString());
} }

View File

@ -29,15 +29,48 @@ class UserActivityStream extends AtomUserNoticeFeed
{ {
public $activities = array(); public $activities = array();
function __construct($user, $indent = true) const OUTPUT_STRING = 1;
const OUTPUT_RAW = 2;
public $outputMode = self::OUTPUT_STRING;
/**
*
* @param User $user
* @param boolean $indent
* @param boolean $outputMode: UserActivityStream::OUTPUT_STRING to return a string,
* or UserActivityStream::OUTPUT_RAW to go to raw output.
* Raw output mode will attempt to stream, keeping less
* data in memory but will leave $this->activities incomplete.
*/
function __construct($user, $indent = true, $outputMode = UserActivityStream::OUTPUT_STRING)
{ {
parent::__construct($user, null, $indent); parent::__construct($user, null, $indent);
$this->outputMode = $outputMode;
if ($this->outputMode == self::OUTPUT_STRING) {
// String buffering? Grab all the notices now.
$notices = $this->getNotices();
} elseif ($this->outputMode == self::OUTPUT_RAW) {
// Raw output... need to restructure from the stringer init.
$this->xw = new XMLWriter();
$this->xw->openURI('php://output');
if(is_null($indent)) {
$indent = common_config('site', 'indent');
}
$this->xw->setIndent($indent);
// We'll fetch notices later.
$notices = array();
} else {
throw new Exception('Invalid outputMode provided to ' . __METHOD__);
}
// Assume that everything but notices is feasible
// to pull at once and work with in memory...
$subscriptions = $this->getSubscriptions(); $subscriptions = $this->getSubscriptions();
$subscribers = $this->getSubscribers(); $subscribers = $this->getSubscribers();
$groups = $this->getGroups(); $groups = $this->getGroups();
$faves = $this->getFaves(); $faves = $this->getFaves();
$notices = $this->getNotices();
$objs = array_merge($subscriptions, $subscribers, $groups, $faves, $notices); $objs = array_merge($subscriptions, $subscribers, $groups, $faves, $notices);
@ -45,16 +78,44 @@ class UserActivityStream extends AtomUserNoticeFeed
usort($objs, 'UserActivityStream::compareObject'); usort($objs, 'UserActivityStream::compareObject');
// We'll keep these around for later, and interleave them into
// the output stream with the user's notices.
foreach ($objs as $obj) { foreach ($objs as $obj) {
$this->activities[] = $obj->asActivity(); $this->activities[] = $obj->asActivity();
} }
} }
/**
* Interleave the pre-sorted subs/groups/faves with the user's
* notices, all in reverse chron order.
*/
function renderEntries() function renderEntries()
{ {
$end = time() + 1;
foreach ($this->activities as $act) { foreach ($this->activities as $act) {
$start = $act->time;
if ($this->outputMode == self::OUTPUT_RAW && $start != $end) {
// In raw mode, we haven't pre-fetched notices.
// Grab the chunks of notices between other activities.
$notices = $this->getNoticesBetween($start, $end);
foreach ($notices as $noticeAct) {
$noticeAct->asActivity()->outputTo($this, false, false);
}
}
// Only show the author sub-element if it's different from default user // Only show the author sub-element if it's different from default user
$act->outputTo($this, false, ($act->actor->id != $this->user->uri)); $act->outputTo($this, false, ($act->actor->id != $this->user->uri));
$end = $start;
}
if ($this->outputMode == self::OUTPUT_RAW) {
// Grab anything after the last pre-sorted activity.
$notices = $this->getNoticesBetween(0, $end);
foreach ($notices as $noticeAct) {
$noticeAct->asActivity()->outputTo($this, false, false);
}
} }
} }
@ -121,7 +182,13 @@ class UserActivityStream extends AtomUserNoticeFeed
return $faves; return $faves;
} }
function getNotices() /**
*
* @param int $start unix timestamp for earliest
* @param int $end unix timestamp for latest
* @return array of Notice objects
*/
function getNoticesBetween($start=0, $end=0)
{ {
$notices = array(); $notices = array();
@ -129,6 +196,17 @@ class UserActivityStream extends AtomUserNoticeFeed
$notice->profile_id = $this->user->id; $notice->profile_id = $this->user->id;
if ($start) {
$tsstart = common_sql_date($start);
$notice->whereAdd("created >= '$tsstart'");
}
if ($end) {
$tsend = common_sql_date($end);
$notice->whereAdd("created < '$tsend'");
}
$notice->orderBy('created DESC');
if ($notice->find()) { if ($notice->find()) {
while ($notice->fetch()) { while ($notice->fetch()) {
$notices[] = clone($notice); $notices[] = clone($notice);
@ -138,6 +216,11 @@ class UserActivityStream extends AtomUserNoticeFeed
return $notices; return $notices;
} }
function getNotices()
{
return $this->getNoticesBetween();
}
function getGroups() function getGroups()
{ {
$groups = array(); $groups = array();

View File

@ -179,28 +179,22 @@ class FacebookBridgePlugin extends Plugin
// Always add the admin panel route // Always add the admin panel route
$m->connect('admin/facebook', array('action' => 'facebookadminpanel')); $m->connect('admin/facebook', array('action' => 'facebookadminpanel'));
// Only add these routes if an application has been setup on $m->connect(
// Facebook for the plugin to use. 'main/facebooklogin',
if ($this->hasApplication()) { array('action' => 'facebooklogin')
);
$m->connect( $m->connect(
'main/facebooklogin', 'main/facebookfinishlogin',
array('action' => 'facebooklogin') array('action' => 'facebookfinishlogin')
); );
$m->connect( $m->connect(
'main/facebookfinishlogin', 'settings/facebook',
array('action' => 'facebookfinishlogin') array('action' => 'facebooksettings')
); );
$m->connect( $m->connect(
'settings/facebook', 'facebook/deauthorize',
array('action' => 'facebooksettings') array('action' => 'facebookdeauthorize')
); );
$m->connect(
'facebook/deauthorize',
array('action' => 'facebookdeauthorize')
);
}
return true; return true;
} }

View File

@ -51,7 +51,14 @@ class Facebookclient
function __construct($notice) function __construct($notice)
{ {
$this->facebook = self::getFacebook(); $this->facebook = self::getFacebook();
$this->notice = $notice;
if (empty($this->facebook)) {
throw new FacebookApiException(
"Could not create Facebook client! Bad application ID or secret?"
);
}
$this->notice = $notice;
$this->flink = Foreign_link::getByUserID( $this->flink = Foreign_link::getByUserID(
$notice->profile_id, $notice->profile_id,
@ -89,6 +96,22 @@ class Facebookclient
$secret = common_config('facebook', 'global_secret'); $secret = common_config('facebook', 'global_secret');
} }
if (empty($appId)) {
common_log(
LOG_WARNING,
"Couldn't find Facebook application ID!",
__FILE__
);
}
if (empty($secret)) {
common_log(
LOG_WARNING,
"Couldn't find Facebook application ID!",
__FILE__
);
}
return new Facebook( return new Facebook(
array( array(
'appId' => $appId, 'appId' => $appId,
@ -174,6 +197,9 @@ class Facebookclient
return $this->sendGraph(); return $this->sendGraph();
} }
} }
// dequeue
return true;
} }
/* /*

View File

@ -36,7 +36,7 @@ require_once INSTALLDIR.'/scripts/commandline.inc';
try { try {
$user = getUser(); $user = getUser();
$actstr = new UserActivityStream($user); $actstr = new UserActivityStream($user, true, UserActivityStream::OUTPUT_RAW);
print $actstr->getString(); print $actstr->getString();
} catch (Exception $e) { } catch (Exception $e) {
print $e->getMessage()."\n"; print $e->getMessage()."\n";