forked from GNUsocial/gnu-social
Put all required field setup into AtomUserNoticeFeed and AtomGroupNoticeFeed, consolidating some code. (RSS feeds pulling title, logo etc from the Atom data structure so we don't dupe it.)
OStatus now calling the feed classes directly instead of faking a call into the API, should be less flakey.
This commit is contained in:
parent
04e474c98c
commit
9fadf8da11
@ -104,30 +104,21 @@ class ApiTimelineGroupAction extends ApiPrivateAuthAction
|
|||||||
|
|
||||||
function showTimeline()
|
function showTimeline()
|
||||||
{
|
{
|
||||||
$sitename = common_config('site', 'name');
|
// We'll pull common formatting out of this for other formats
|
||||||
$avatar = $this->group->homepage_logo;
|
$atom = new AtomGroupNoticeFeed($this->group);
|
||||||
$title = sprintf(_("%s timeline"), $this->group->nickname);
|
|
||||||
|
|
||||||
$subtitle = sprintf(
|
|
||||||
_('Updates from %1$s on %2$s!'),
|
|
||||||
$this->group->nickname,
|
|
||||||
$sitename
|
|
||||||
);
|
|
||||||
|
|
||||||
$logo = ($avatar) ? $avatar : User_group::defaultLogo(AVATAR_PROFILE_SIZE);
|
|
||||||
|
|
||||||
switch($this->format) {
|
switch($this->format) {
|
||||||
case 'xml':
|
case 'xml':
|
||||||
$this->showXmlTimeline($this->notices);
|
$this->showXmlTimeline($this->notices);
|
||||||
break;
|
break;
|
||||||
case 'rss':
|
case 'rss':
|
||||||
$this->showRssTimeline(
|
$this->showRssTimeline(
|
||||||
$this->notices,
|
$this->notices,
|
||||||
$title,
|
$atom->title,
|
||||||
$this->group->homeUrl(),
|
$this->group->homeUrl(),
|
||||||
$subtitle,
|
$atom->subtitle,
|
||||||
null,
|
null,
|
||||||
$logo
|
$atom->logo
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
case 'atom':
|
case 'atom':
|
||||||
@ -136,38 +127,22 @@ class ApiTimelineGroupAction extends ApiPrivateAuthAction
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
$atom = new AtomGroupNoticeFeed($this->group);
|
|
||||||
|
|
||||||
// @todo set all this Atom junk up inside the feed class
|
|
||||||
|
|
||||||
#$atom->setId($id);
|
|
||||||
$atom->setTitle($title);
|
|
||||||
$atom->setSubtitle($subtitle);
|
|
||||||
$atom->setLogo($logo);
|
|
||||||
$atom->setUpdated('now');
|
|
||||||
|
|
||||||
$atom->addAuthorRaw($this->group->asAtomAuthor());
|
$atom->addAuthorRaw($this->group->asAtomAuthor());
|
||||||
$atom->setActivitySubject($this->group->asActivitySubject());
|
$atom->setActivitySubject($this->group->asActivitySubject());
|
||||||
|
|
||||||
$atom->addLink($this->group->homeUrl());
|
|
||||||
|
|
||||||
$id = $this->arg('id');
|
$id = $this->arg('id');
|
||||||
$aargs = array('format' => 'atom');
|
$aargs = array('format' => 'atom');
|
||||||
if (!empty($id)) {
|
if (!empty($id)) {
|
||||||
$aargs['id'] = $id;
|
$aargs['id'] = $id;
|
||||||
}
|
}
|
||||||
|
$self = $this->getSelfUri('ApiTimelineGroup', $aargs);
|
||||||
|
|
||||||
$atom->setId($this->getSelfUri('ApiTimelineGroup', $aargs));
|
$atom->setId($self);
|
||||||
|
$atom->setSelfLink($self);
|
||||||
$atom->addLink(
|
|
||||||
$this->getSelfUri('ApiTimelineGroup', $aargs),
|
|
||||||
array('rel' => 'self', 'type' => 'application/atom+xml')
|
|
||||||
);
|
|
||||||
|
|
||||||
$atom->addEntryFromNotices($this->notices);
|
$atom->addEntryFromNotices($this->notices);
|
||||||
|
|
||||||
//$this->raw($atom->getString());
|
$this->raw($atom->getString());
|
||||||
print $atom->getString(); // temp hack until PuSH feeds are redone cleanly
|
|
||||||
|
|
||||||
} catch (Atom10FeedException $e) {
|
} catch (Atom10FeedException $e) {
|
||||||
$this->serverError(
|
$this->serverError(
|
||||||
|
@ -112,19 +112,17 @@ class ApiTimelineUserAction extends ApiBareAuthAction
|
|||||||
function showTimeline()
|
function showTimeline()
|
||||||
{
|
{
|
||||||
$profile = $this->user->getProfile();
|
$profile = $this->user->getProfile();
|
||||||
$avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
|
|
||||||
|
|
||||||
$sitename = common_config('site', 'name');
|
// We'll use the shared params from the Atom stub
|
||||||
$title = sprintf(_("%s timeline"), $this->user->nickname);
|
// for other feed types.
|
||||||
|
$atom = new AtomUserNoticeFeed($this->user);
|
||||||
|
$title = $atom->title;
|
||||||
$link = common_local_url(
|
$link = common_local_url(
|
||||||
'showstream',
|
'showstream',
|
||||||
array('nickname' => $this->user->nickname)
|
array('nickname' => $this->user->nickname)
|
||||||
);
|
);
|
||||||
$subtitle = sprintf(
|
$subtitle = $atom->subtitle;
|
||||||
_('Updates from %1$s on %2$s!'),
|
$logo = $atom->logo;
|
||||||
$this->user->nickname, $sitename
|
|
||||||
);
|
|
||||||
$logo = ($avatar) ? $avatar->displayUrl() : Avatar::defaultImage(AVATAR_PROFILE_SIZE);
|
|
||||||
|
|
||||||
// FriendFeed's SUP protocol
|
// FriendFeed's SUP protocol
|
||||||
// Also added RSS and Atom feeds
|
// Also added RSS and Atom feeds
|
||||||
@ -146,47 +144,18 @@ class ApiTimelineUserAction extends ApiBareAuthAction
|
|||||||
|
|
||||||
header('Content-Type: application/atom+xml; charset=utf-8');
|
header('Content-Type: application/atom+xml; charset=utf-8');
|
||||||
|
|
||||||
// @todo set all this Atom junk up inside the feed class
|
|
||||||
|
|
||||||
$atom = new AtomUserNoticeFeed($this->user);
|
|
||||||
|
|
||||||
$atom->setTitle($title);
|
|
||||||
$atom->setSubtitle($subtitle);
|
|
||||||
$atom->setLogo($logo);
|
|
||||||
$atom->setUpdated('now');
|
|
||||||
|
|
||||||
$atom->addLink(
|
|
||||||
common_local_url(
|
|
||||||
'showstream',
|
|
||||||
array('nickname' => $this->user->nickname)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
$id = $this->arg('id');
|
$id = $this->arg('id');
|
||||||
$aargs = array('format' => 'atom');
|
$aargs = array('format' => 'atom');
|
||||||
if (!empty($id)) {
|
if (!empty($id)) {
|
||||||
$aargs['id'] = $id;
|
$aargs['id'] = $id;
|
||||||
}
|
}
|
||||||
|
$self = $this->getSelfUri('ApiTimelineUser', $aargs);
|
||||||
$atom->setId($this->getSelfUri('ApiTimelineUser', $aargs));
|
$atom->setId($self);
|
||||||
|
$atom->setSelfLink($self);
|
||||||
$atom->addLink(
|
|
||||||
$this->getSelfUri('ApiTimelineUser', $aargs),
|
|
||||||
array('rel' => 'self', 'type' => 'application/atom+xml')
|
|
||||||
);
|
|
||||||
|
|
||||||
$atom->addLink(
|
|
||||||
$suplink,
|
|
||||||
array(
|
|
||||||
'rel' => 'http://api.friendfeed.com/2008/03#sup',
|
|
||||||
'type' => 'application/json'
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
$atom->addEntryFromNotices($this->notices);
|
$atom->addEntryFromNotices($this->notices);
|
||||||
|
|
||||||
#$this->raw($atom->getString());
|
$this->raw($atom->getString());
|
||||||
print $atom->getString(); // temporary for output buffering
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case 'json':
|
case 'json':
|
||||||
|
@ -49,6 +49,8 @@ class Atom10FeedException extends Exception
|
|||||||
class Atom10Feed extends XMLStringer
|
class Atom10Feed extends XMLStringer
|
||||||
{
|
{
|
||||||
public $xw;
|
public $xw;
|
||||||
|
|
||||||
|
// @fixme most of these should probably be read-only properties
|
||||||
private $namespaces;
|
private $namespaces;
|
||||||
private $authors;
|
private $authors;
|
||||||
private $subject;
|
private $subject;
|
||||||
@ -57,10 +59,12 @@ class Atom10Feed extends XMLStringer
|
|||||||
private $generator;
|
private $generator;
|
||||||
private $icon;
|
private $icon;
|
||||||
private $links;
|
private $links;
|
||||||
private $logo;
|
private $selfLink;
|
||||||
|
private $selfLinkType;
|
||||||
|
public $logo;
|
||||||
private $rights;
|
private $rights;
|
||||||
private $subtitle;
|
public $subtitle;
|
||||||
private $title;
|
public $title;
|
||||||
private $published;
|
private $published;
|
||||||
private $updated;
|
private $updated;
|
||||||
private $entries;
|
private $entries;
|
||||||
@ -184,6 +188,10 @@ class Atom10Feed extends XMLStringer
|
|||||||
|
|
||||||
$this->renderAuthors();
|
$this->renderAuthors();
|
||||||
|
|
||||||
|
if ($this->selfLink) {
|
||||||
|
$this->addLink($this->selfLink, array('rel' => 'self',
|
||||||
|
'type' => $this->selfLinkType));
|
||||||
|
}
|
||||||
$this->renderLinks();
|
$this->renderLinks();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -253,6 +261,12 @@ class Atom10Feed extends XMLStringer
|
|||||||
$this->id = $id;
|
$this->id = $id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function setSelfLink($url, $type='application/atom+xml')
|
||||||
|
{
|
||||||
|
$this->selfLink = $url;
|
||||||
|
$this->selfLinkType = $type;
|
||||||
|
}
|
||||||
|
|
||||||
function setTitle($title)
|
function setTitle($title)
|
||||||
{
|
{
|
||||||
$this->title = $title;
|
$this->title = $title;
|
||||||
|
@ -49,14 +49,42 @@ class AtomGroupNoticeFeed extends AtomNoticeFeed
|
|||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
*
|
*
|
||||||
* @param Group $group the group for the feed (optional)
|
* @param Group $group the group for the feed
|
||||||
* @param boolean $indent flag to turn indenting on or off
|
* @param boolean $indent flag to turn indenting on or off
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
function __construct($group = null, $indent = true) {
|
function __construct($group, $indent = true) {
|
||||||
parent::__construct($indent);
|
parent::__construct($indent);
|
||||||
$this->group = $group;
|
$this->group = $group;
|
||||||
|
|
||||||
|
$title = sprintf(_("%s timeline"), $group->nickname);
|
||||||
|
$this->setTitle($title);
|
||||||
|
|
||||||
|
$sitename = common_config('site', 'name');
|
||||||
|
$subtitle = sprintf(
|
||||||
|
_('Updates from %1$s on %2$s!'),
|
||||||
|
$group->nickname,
|
||||||
|
$sitename
|
||||||
|
);
|
||||||
|
$this->setSubtitle($subtitle);
|
||||||
|
|
||||||
|
$avatar = $group->homepage_logo;
|
||||||
|
$logo = ($avatar) ? $avatar : User_group::defaultLogo(AVATAR_PROFILE_SIZE);
|
||||||
|
$this->setLogo($logo);
|
||||||
|
|
||||||
|
$this->setUpdated('now');
|
||||||
|
|
||||||
|
$self = common_local_url('ApiTimelineGroup',
|
||||||
|
array('id' => $group->id,
|
||||||
|
'format' => 'atom'));
|
||||||
|
$this->setId($self);
|
||||||
|
$this->setSelfLink($self);
|
||||||
|
|
||||||
|
$this->addAuthorRaw($group->asAtomAuthor());
|
||||||
|
$this->setActivitySubject($group->asActivitySubject());
|
||||||
|
|
||||||
|
$this->addLink($group->homeUrl());
|
||||||
}
|
}
|
||||||
|
|
||||||
function getGroup()
|
function getGroup()
|
||||||
|
@ -49,19 +49,56 @@ class AtomUserNoticeFeed extends AtomNoticeFeed
|
|||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
*
|
*
|
||||||
* @param User $user the user for the feed (optional)
|
* @param User $user the user for the feed
|
||||||
* @param boolean $indent flag to turn indenting on or off
|
* @param boolean $indent flag to turn indenting on or off
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
|
|
||||||
function __construct($user = null, $indent = true) {
|
function __construct($user, $indent = true) {
|
||||||
parent::__construct($indent);
|
parent::__construct($indent);
|
||||||
$this->user = $user;
|
$this->user = $user;
|
||||||
if (!empty($user)) {
|
if (!empty($user)) {
|
||||||
$profile = $user->getProfile();
|
$profile = $user->getProfile();
|
||||||
$this->addAuthor($profile->nickname, $user->uri);
|
$this->addAuthor($profile->nickname, $user->uri);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$title = sprintf(_("%s timeline"), $user->nickname);
|
||||||
|
$this->setTitle($title);
|
||||||
|
|
||||||
|
$sitename = common_config('site', 'name');
|
||||||
|
$subtitle = sprintf(
|
||||||
|
_('Updates from %1$s on %2$s!'),
|
||||||
|
$user->nickname, $sitename
|
||||||
|
);
|
||||||
|
$this->setSubtitle($subtitle);
|
||||||
|
|
||||||
|
$avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
|
||||||
|
$logo = ($avatar) ? $avatar->displayUrl() : Avatar::defaultImage(AVATAR_PROFILE_SIZE);
|
||||||
|
$this->setLogo($logo);
|
||||||
|
|
||||||
|
$this->setUpdated('now');
|
||||||
|
|
||||||
|
$this->addLink(
|
||||||
|
common_local_url(
|
||||||
|
'showstream',
|
||||||
|
array('nickname' => $user->nickname)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
$self = common_local_url('ApiTimelineUser',
|
||||||
|
array('id' => $user->id,
|
||||||
|
'format' => 'atom'));
|
||||||
|
$this->setId($self);
|
||||||
|
$this->setSelfLink($self);
|
||||||
|
|
||||||
|
$this->addLink(
|
||||||
|
common_local_url('sup', null, null, $user->id),
|
||||||
|
array(
|
||||||
|
'rel' => 'http://api.friendfeed.com/2008/03#sup',
|
||||||
|
'type' => 'application/json'
|
||||||
|
)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function getUser()
|
function getUser()
|
||||||
|
@ -164,46 +164,21 @@ class OStatusQueueHandler extends QueueHandler
|
|||||||
*/
|
*/
|
||||||
function userFeedForNotice()
|
function userFeedForNotice()
|
||||||
{
|
{
|
||||||
// @fixme this feels VERY hacky...
|
$atom = new AtomUserNoticeFeed($this->user);
|
||||||
// should probably be a cleaner way to do it
|
$atom->addEntryFromNotice($this->notice);
|
||||||
|
$feed = $atom->getString();
|
||||||
|
|
||||||
ob_start();
|
|
||||||
$api = new ApiTimelineUserAction();
|
|
||||||
$api->prepare(array('id' => $this->notice->profile_id,
|
|
||||||
'format' => 'atom',
|
|
||||||
'max_id' => $this->notice->id,
|
|
||||||
'since_id' => $this->notice->id - 1));
|
|
||||||
$api->showTimeline();
|
|
||||||
$feed = ob_get_clean();
|
|
||||||
|
|
||||||
// ...and override the content-type back to something normal... eww!
|
|
||||||
// hope there's no other headers that got set while we weren't looking.
|
|
||||||
header('Content-Type: text/html; charset=utf-8');
|
|
||||||
|
|
||||||
common_log(LOG_DEBUG, $feed);
|
|
||||||
return $feed;
|
return $feed;
|
||||||
}
|
}
|
||||||
|
|
||||||
function groupFeedForNotice($group_id)
|
function groupFeedForNotice($group_id)
|
||||||
{
|
{
|
||||||
// @fixme this feels VERY hacky...
|
$group = User_group::staticGet('id', $group_id);
|
||||||
// should probably be a cleaner way to do it
|
|
||||||
|
|
||||||
ob_start();
|
$atom = new AtomGroupNoticeFeed($group);
|
||||||
$api = new ApiTimelineGroupAction();
|
$atom->addEntryFromNotice($this->notice);
|
||||||
$args = array('id' => $group_id,
|
$feed = $atom->getString();
|
||||||
'format' => 'atom',
|
|
||||||
'max_id' => $this->notice->id,
|
|
||||||
'since_id' => $this->notice->id - 1);
|
|
||||||
$api->prepare($args);
|
|
||||||
$api->handle($args);
|
|
||||||
$feed = ob_get_clean();
|
|
||||||
|
|
||||||
// ...and override the content-type back to something normal... eww!
|
|
||||||
// hope there's no other headers that got set while we weren't looking.
|
|
||||||
header('Content-Type: text/html; charset=utf-8');
|
|
||||||
|
|
||||||
common_log(LOG_DEBUG, $feed);
|
|
||||||
return $feed;
|
return $feed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user