diff --git a/classes/Fave.php b/classes/Fave.php index 59a1e00318..455e7b089c 100644 --- a/classes/Fave.php +++ b/classes/Fave.php @@ -124,9 +124,18 @@ class Fave extends Managed_DataObject function asActivity() { - $notice = Notice::staticGet('id', $this->notice_id); + $notice = Notice::staticGet('id', $this->notice_id); + + if (!$notice) { + throw new Exception("Fave for non-existent notice: " . $this->notice_id); + } + $profile = Profile::staticGet('id', $this->user_id); + if (!$profile) { + throw new Exception("Fave by non-existent profile: " . $this->user_id); + } + $act = new Activity(); $act->verb = ActivityVerb::FAVORITE; diff --git a/lib/useractivitystream.php b/lib/useractivitystream.php index 3f50b9c302..59ae6184b3 100644 --- a/lib/useractivitystream.php +++ b/lib/useractivitystream.php @@ -75,61 +75,121 @@ class UserActivityStream extends AtomUserNoticeFeed $objs = array_merge($subscriptions, $subscribers, $groups, $faves, $notices); + $subscriptions = null; + $subscribers = null; + $groups = null; + $faves = null; + + unset($subscriptions); + unset($subscribers); + unset($groups); + unset($faves); + // Sort by create date 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) { - try { - $this->activities[] = $obj->asActivity(); - } catch (Exception $e) { - // Continue - } - } + + $this->objs = $objs; } /** * Interleave the pre-sorted subs/groups/faves with the user's * notices, all in reverse chron order. */ - function renderEntries() + function renderEntries($format=Feed::ATOM, $handle=null) { + $haveOne = false; + $end = time() + 1; - foreach ($this->activities as $act) { + foreach ($this->objs as $obj) { + try { + $act = $obj->asActivity(); + } catch (Exception $e) { + common_log(LOG_ERR, $e->getMessage()); + continue; + } + $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) { - try { - $nact = $noticeAct->asActivity(); - $nact->outputTo($this, false, false); - } catch (Exception $e) { - // Continue + try { + $notices = $this->getNoticesBetween($start, $end); + foreach ($notices as $noticeAct) { + try { + $nact = $noticeAct->asActivity(); + if ($format == Feed::ATOM) { + $nact->outputTo($this, false, false); + } else { + if ($haveOne) { + fwrite($handle, ","); + } + fwrite($handle, json_encode($nact->asArray())); + $haveOne = true; + } + } catch (Exception $e) { + common_log(LOG_ERR, $e->getMessage()); + continue; + } + $nact = null; + unset($nact); } + } catch (Exception $e) { + common_log(LOG_ERR, $e->getMessage()); } } - // Only show the author sub-element if it's different from default user - $act->outputTo($this, false, ($act->actor->id != $this->user->uri)); + $notices = null; + unset($notices); + + try { + if ($format == Feed::ATOM) { + // Only show the author sub-element if it's different from default user + $act->outputTo($this, false, ($act->actor->id != $this->user->uri)); + } else { + if ($haveOne) { + fwrite($handle, ","); + } + fwrite($handle, json_encode($act->asArray())); + $haveOne = true; + } + } catch (Exception $e) { + common_log(LOG_ERR, $e->getMessage()); + } + + $act = null; + unset($act); $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) { - try { - $nact = $noticeAct->asActivity(); - $nact->outputTo($this, false, false); - } catch (Exception $e) { - // Continue + try { + $notices = $this->getNoticesBetween(0, $end); + foreach ($notices as $noticeAct) { + try { + $nact = $noticeAct->asActivity(); + if ($format == Feed::ATOM) { + $nact->outputTo($this, false, false); + } else { + if ($haveOne) { + fwrite($handle, ","); + } + fwrite($handle, json_encode($nact->asArray())); + $haveOne = true; + } + } catch (Exception $e) { + common_log(LOG_ERR, $e->getMessage()); + continue; + } } + } catch (Exception $e) { + common_log(LOG_ERR, $e->getMessage()); } } @@ -271,4 +331,12 @@ class UserActivityStream extends AtomUserNoticeFeed return $groups; } + + function writeJSON($handle) + { + require_once INSTALLDIR.'/lib/activitystreamjsondocument.php'; + fwrite($handle, '{"items": ['); + $this->renderEntries(Feed::JSON, $handle); + fwrite($handle, ']}'); + } } diff --git a/scripts/backupuser.php b/scripts/backupuser.php index ee2951fc8f..d183dba2b9 100644 --- a/scripts/backupuser.php +++ b/scripts/backupuser.php @@ -19,8 +19,8 @@ define('INSTALLDIR', realpath(dirname(__FILE__) . '/..')); -$shortoptions = 'i:n:f:'; -$longoptions = array('id=', 'nickname=', 'file='); +$shortoptions = 'i:n:f:j'; +$longoptions = array('id=', 'nickname=', 'file=', 'json'); $helptext = <<getString(); + if (have_option('j', 'json')) { + $actstr->writeJSON(STDOUT); + } else { + print $actstr->getString(); + } } catch (Exception $e) { print $e->getMessage()."\n"; exit(1);