From 1a811883556086b9a754d07b0dc996d3000dcbf1 Mon Sep 17 00:00:00 2001 From: Mikael Nordfeldth Date: Mon, 12 May 2014 10:27:52 +0200 Subject: [PATCH] Use an Event to present notices conversations --- EVENTS.txt | 10 +++++++ actions/conversation.php | 57 +++++++++++++++------------------------- classes/Conversation.php | 11 ++++++++ 3 files changed, 42 insertions(+), 36 deletions(-) diff --git a/EVENTS.txt b/EVENTS.txt index fe36855785..6e32042453 100644 --- a/EVENTS.txt +++ b/EVENTS.txt @@ -1298,6 +1298,16 @@ EndShowGroupProfileBlock: After showing the profile block for a group - $out: XMLOutputter to append custom output - $group: the group being shown +StartShowConversation: start the listing of a conversation +- $action: Action object (used mainly as HTMLOutputter) +- $conv: Conversation object, has functions to retrieve relevant notices +- $scoped: Profile for scoping (null if not logged in) + +EndShowConversation: after the listing of a conversation +- $action: Action object (used mainly as HTMLOutputter) +- $conv: Conversation object, has functions to retrieve relevant notices +- $scoped: Profile for scoping (null if not logged in) + StartShowThreadedNoticeTail: when showing the replies etc. to a notice - $nli: parent noticelistitem - $notice: parent notice diff --git a/actions/conversation.php b/actions/conversation.php index 3eb588c651..3b6f48c853 100644 --- a/actions/conversation.php +++ b/actions/conversation.php @@ -7,6 +7,7 @@ * @category Action * @package StatusNet * @author Evan Prodromou + * @author Mikael Nordfeldth * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 * @link http://status.net/ * @@ -27,32 +28,27 @@ * along with this program. If not, see . */ -if (!defined('STATUSNET') && !defined('LACONICA')) { - exit(1); -} - -// XXX: not sure how to do paging yet, -// so set a 60-notice limit - -require_once INSTALLDIR.'/lib/noticelist.php'; +if (!defined('GNUSOCIAL')) { exit(1); } /** * Conversation tree in the browser * + * Will always try to show the entire conversation, since that's how our + * ConversationNoticeStream works. + * * @category Action * @package StatusNet * @author Evan Prodromou + * @author Mikael Nordfeldth * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 * @link http://status.net/ */ class ConversationAction extends ManagedAction { - var $id = null; + var $conv = null; var $page = null; var $notices = null; - const MAX_NOTICES = 500; - /** * Initialization. * @@ -63,19 +59,12 @@ class ConversationAction extends ManagedAction protected function prepare(array $args=array()) { parent::prepare($args); - $this->id = $this->trimmed('id'); - if (empty($this->id)) { - return false; - } - $this->id = $this->id+0; - $this->page = $this->trimmed('page'); - if (empty($this->page)) { - $this->page = 1; - } + $convId = $this->int('id'); - $stream = new ConversationNoticeStream($this->id, $this->scoped); - - $this->notices = $stream->getNotices(0, self::MAX_NOTICES); + $this->conv = Conversation::getKV('id', $convId); + if (!$this->conv instanceof Conversation) { + throw new ClientException('Could not find specified conversation'); + } return true; } @@ -94,22 +83,18 @@ class ConversationAction extends ManagedAction /** * Show content. * - * Display a hierarchical unordered list in the content area. - * Uses ConversationTree to do most of the heavy lifting. + * NoticeList extended classes do most heavy lifting. Plugins can override. * * @return void */ function showContent() { - $user = common_current_user(); - - if (!empty($user) && $user->conversationTree()) { - $nl = new ConversationTree($this->notices, $this); - } else { - $nl = new FullThreadedNoticeList($this->notices, $this, $this->scoped); + if (Event::handle('StartShowConversation', array($this, $this->conv, $this->scoped))) { + $notices = $this->conv->getNotices(); + $nl = new FullThreadedNoticeList($notices, $this, $this->scoped); + $cnt = $nl->show(); } - - $cnt = $nl->show(); + Event::handle('EndShowConversation', array($this, $this->conv, $this->scoped)); } function isReadOnly() @@ -123,7 +108,7 @@ class ConversationAction extends ManagedAction return array(new Feed(Feed::JSON, common_local_url('apiconversation', array( - 'id' => $this->id, + 'id' => $this->conv->id, 'format' => 'as')), // TRANS: Title for link to notice feed. // TRANS: %s is a user nickname. @@ -131,7 +116,7 @@ class ConversationAction extends ManagedAction new Feed(Feed::RSS2, common_local_url('apiconversation', array( - 'id' => $this->id, + 'id' => $this->conv->id, 'format' => 'rss')), // TRANS: Title for link to notice feed. // TRANS: %s is a user nickname. @@ -139,7 +124,7 @@ class ConversationAction extends ManagedAction new Feed(Feed::ATOM, common_local_url('apiconversation', array( - 'id' => $this->id, + 'id' => $this->conv->id, 'format' => 'atom')), // TRANS: Title for link to notice feed. // TRANS: %s is a user nickname. diff --git a/classes/Conversation.php b/classes/Conversation.php index faca20f9c6..3acc283d62 100755 --- a/classes/Conversation.php +++ b/classes/Conversation.php @@ -121,4 +121,15 @@ class Conversation extends Managed_DataObject return common_local_url('conversation', array('id' => $this->id)) . ($noticeId===null ? '' : "#notice-{$noticeId}"); } + + // FIXME: ...will 500 ever be too low? Taken from ConversationAction::MAX_NOTICES + public function getNotices($offset=0, $limit=500, Profile $scoped=null) + { + if ($scoped === null) { + $scoped = Profile::current(); + } + $stream = new ConversationNoticeStream($this->id, $scoped); + $notices = $stream->getNotices($offset, $limit); + return $notices; + } }