/**
  * For initializing members of the class.
  *
  * @param array $argarray misc. arguments
  *
  * @return boolean true
  */
 function prepare($argarray)
 {
     parent::prepare($argarray);
     $convId = $this->trimmed('id');
     if (empty($convId)) {
         // TRANS: Client exception thrown when no conversation ID is given.
         throw new ClientException(_('No conversation ID.'));
     }
     $this->conversation = Conversation::staticGet('id', $convId);
     if (empty($this->conversation)) {
         // TRANS: Client exception thrown when referring to a non-existing conversation ID (%d).
         $this->clientError(_('No conversation ID found'), 404);
         return false;
     }
     $profile = Profile::current();
     $stream = new ConversationNoticeStream($convId, $profile);
     $notice = $stream->getNotices(($this->page - 1) * $this->count, $this->count, $this->since_id, $this->max_id);
     $this->notices = $notice->fetchAll();
     $originalConversation = new Notice();
     $originalConversation->whereAdd('conversation=' . $convId);
     $originalConversation->limit(1);
     $originalConversation->orderBy('created');
     $originalConversation->find();
     if ($originalConversation->fetch()) {
         $this->originalNotice = $originalConversation;
     }
     return true;
 }
Example #2
0
 /**
  * For initializing members of the class.
  *
  * @param array $argarray misc. arguments
  *
  * @return boolean true
  */
 function prepare($argarray)
 {
     parent::prepare($argarray);
     $convId = $this->trimmed('id');
     if (empty($convId)) {
         // TRANS: Client exception thrown when no conversation ID is given.
         throw new ClientException(_('No conversation ID.'));
     }
     $this->conversation = Conversation::staticGet('id', $convId);
     if (empty($this->conversation)) {
         // TRANS: Client exception thrown when referring to a non-existing conversation ID (%d).
         throw new ClientException(sprintf(_('No conversation with ID %d.'), $convId), 404);
     }
     $profile = Profile::current();
     $stream = new ConversationNoticeStream($convId, $profile);
     $notice = $stream->getNotices(($this->page - 1) * $this->count, $this->count, $this->since_id, $this->max_id);
     $this->notices = $notice->fetchAll();
     return true;
 }
Example #3
0
 /**
  * show link to notice this notice is a reply to
  *
  * If this notice is a reply, show a link to the notice it is replying to. The
  * heavy lifting for figuring out replies happens at save time.
  *
  * @return void
  */
 function showContext()
 {
     if ($this->notice->hasConversation()) {
         $conv = Conversation::staticGet('id', $this->notice->conversation);
         $convurl = $conv->uri;
         if (!empty($convurl)) {
             $this->out->text(' ');
             $this->out->element('a', array('href' => $convurl . '#notice-' . $this->notice->id, 'class' => 'response'), _('in context'));
         } else {
             $msg = sprintf("Couldn't find Conversation ID %d to make 'in context'" . "link for Notice ID %d", $this->notice->conversation, $this->notice->id);
             common_log(LOG_WARNING, $msg);
         }
     }
 }
 function getConversationUrl($notice)
 {
     $convurl = null;
     if ($notice->hasConversation()) {
         $conv = Conversation::staticGet('id', $notice->conversation);
         $convurl = $conv->uri;
         if (empty($convurl)) {
             $msg = sprintf("Couldn't find Conversation ID %d to make 'in context'" . "link for Notice ID %d", $notice->conversation, $notice->id);
             common_log(LOG_WARNING, $msg);
         } else {
             $convurl .= '#notice-' . $notice->id;
         }
     }
     return $convurl;
 }
Example #5
0
 function asAtomEntry($namespace = false, $source = false, $author = true, $cur = null)
 {
     $profile = $this->getProfile();
     $xs = new XMLStringer(true);
     if ($namespace) {
         $attrs = array('xmlns' => 'http://www.w3.org/2005/Atom', 'xmlns:thr' => 'http://purl.org/syndication/thread/1.0', 'xmlns:georss' => 'http://www.georss.org/georss', 'xmlns:activity' => 'http://activitystrea.ms/spec/1.0/', 'xmlns:media' => 'http://purl.org/syndication/atommedia', 'xmlns:poco' => 'http://portablecontacts.net/spec/1.0', 'xmlns:ostatus' => 'http://ostatus.org/schema/1.0', 'xmlns:statusnet' => 'http://status.net/schema/api/1/');
     } else {
         $attrs = array();
     }
     if (Event::handle('StartActivityStart', array(&$this, &$xs, &$attrs))) {
         $xs->elementStart('entry', $attrs);
         Event::handle('EndActivityStart', array(&$this, &$xs, &$attrs));
     }
     if (Event::handle('StartActivitySource', array(&$this, &$xs))) {
         if ($source) {
             $atom_feed = $profile->getAtomFeed();
             if (!empty($atom_feed)) {
                 $xs->elementStart('source');
                 // XXX: we should store the actual feed ID
                 $xs->element('id', null, $atom_feed);
                 // XXX: we should store the actual feed title
                 $xs->element('title', null, $profile->getBestName());
                 $xs->element('link', array('rel' => 'alternate', 'type' => 'text/html', 'href' => $profile->profileurl));
                 $xs->element('link', array('rel' => 'self', 'type' => 'application/atom+xml', 'href' => $atom_feed));
                 $xs->element('icon', null, $profile->avatarUrl(AVATAR_PROFILE_SIZE));
                 $notice = $profile->getCurrentNotice();
                 if (!empty($notice)) {
                     $xs->element('updated', null, self::utcDate($notice->created));
                 }
                 $user = User::staticGet('id', $profile->id);
                 if (!empty($user)) {
                     $xs->element('link', array('rel' => 'license', 'href' => common_config('license', 'url')));
                 }
                 $xs->elementEnd('source');
             }
         }
         Event::handle('EndActivitySource', array(&$this, &$xs));
     }
     $title = common_xml_safe_str($this->content);
     if (Event::handle('StartActivityTitle', array(&$this, &$xs, &$title))) {
         $xs->element('title', null, $title);
         Event::handle('EndActivityTitle', array($this, &$xs, $title));
     }
     $atomAuthor = '';
     if ($author) {
         $atomAuthor = $profile->asAtomAuthor($cur);
     }
     if (Event::handle('StartActivityAuthor', array(&$this, &$xs, &$atomAuthor))) {
         if (!empty($atomAuthor)) {
             $xs->raw($atomAuthor);
             Event::handle('EndActivityAuthor', array(&$this, &$xs, &$atomAuthor));
         }
     }
     $actor = '';
     if ($author) {
         $actor = $profile->asActivityActor();
     }
     if (Event::handle('StartActivityActor', array(&$this, &$xs, &$actor))) {
         if (!empty($actor)) {
             $xs->raw($actor);
             Event::handle('EndActivityActor', array(&$this, &$xs, &$actor));
         }
     }
     $url = $this->bestUrl();
     if (Event::handle('StartActivityLink', array(&$this, &$xs, &$url))) {
         $xs->element('link', array('rel' => 'alternate', 'type' => 'text/html', 'href' => $url));
         Event::handle('EndActivityLink', array(&$this, &$xs, $url));
     }
     $id = $this->uri;
     if (Event::handle('StartActivityId', array(&$this, &$xs, &$id))) {
         $xs->element('id', null, $id);
         Event::handle('EndActivityId', array(&$this, &$xs, $id));
     }
     $published = self::utcDate($this->created);
     if (Event::handle('StartActivityPublished', array(&$this, &$xs, &$published))) {
         $xs->element('published', null, $published);
         Event::handle('EndActivityPublished', array(&$this, &$xs, $published));
     }
     $updated = $published;
     // XXX: notices are usually immutable
     if (Event::handle('StartActivityUpdated', array(&$this, &$xs, &$updated))) {
         $xs->element('updated', null, $updated);
         Event::handle('EndActivityUpdated', array(&$this, &$xs, $updated));
     }
     $content = common_xml_safe_str($this->rendered);
     if (Event::handle('StartActivityContent', array(&$this, &$xs, &$content))) {
         $xs->element('content', array('type' => 'html'), $content);
         Event::handle('EndActivityContent', array(&$this, &$xs, $content));
     }
     // Most of our notices represent POSTing a NOTE. This is the default verb
     // for activity streams, so we normally just leave it out.
     $verb = ActivityVerb::POST;
     if (Event::handle('StartActivityVerb', array(&$this, &$xs, &$verb))) {
         $xs->element('activity:verb', null, $verb);
         Event::handle('EndActivityVerb', array(&$this, &$xs, $verb));
     }
     // We use the default behavior for activity streams: if there's no activity:object,
     // then treat the entry itself as the object. Here, you can set the type of that object,
     // which is normally a NOTE.
     $type = ActivityObject::NOTE;
     if (Event::handle('StartActivityDefaultObjectType', array(&$this, &$xs, &$type))) {
         $xs->element('activity:object-type', null, $type);
         Event::handle('EndActivityDefaultObjectType', array(&$this, &$xs, $type));
     }
     // Since we usually use the entry itself as an object, we don't have an explicit
     // object. Some extensions may want to add them (for photo, event, music, etc.).
     $objects = array();
     if (Event::handle('StartActivityObjects', array(&$this, &$xs, &$objects))) {
         foreach ($objects as $object) {
             $xs->raw($object->asString());
         }
         Event::handle('EndActivityObjects', array(&$this, &$xs, $objects));
     }
     $noticeInfoAttr = array('local_id' => $this->id);
     // local notice ID (useful to clients for ordering)
     $ns = $this->getSource();
     if (!empty($ns)) {
         $noticeInfoAttr['source'] = $ns->code;
         if (!empty($ns->url)) {
             $noticeInfoAttr['source_link'] = $ns->url;
             if (!empty($ns->name)) {
                 $noticeInfoAttr['source'] = '<a href="' . htmlspecialchars($ns->url) . '" rel="nofollow">' . htmlspecialchars($ns->name) . '</a>';
             }
         }
     }
     if (!empty($cur)) {
         $noticeInfoAttr['favorite'] = $cur->hasFave($this) ? "true" : "false";
         $profile = $cur->getProfile();
         $noticeInfoAttr['repeated'] = $profile->hasRepeated($this->id) ? "true" : "false";
     }
     if (!empty($this->repeat_of)) {
         $noticeInfoAttr['repeat_of'] = $this->repeat_of;
     }
     if (Event::handle('StartActivityNoticeInfo', array(&$this, &$xs, &$noticeInfoAttr))) {
         $xs->element('statusnet:notice_info', $noticeInfoAttr, null);
         Event::handle('EndActivityNoticeInfo', array(&$this, &$xs, $noticeInfoAttr));
     }
     $replyNotice = null;
     if ($this->reply_to) {
         $replyNotice = Notice::staticGet('id', $this->reply_to);
     }
     if (Event::handle('StartActivityInReplyTo', array(&$this, &$xs, &$replyNotice))) {
         if (!empty($replyNotice)) {
             $xs->element('link', array('rel' => 'related', 'href' => $replyNotice->bestUrl()));
             $xs->element('thr:in-reply-to', array('ref' => $replyNotice->uri, 'href' => $replyNotice->bestUrl()));
             Event::handle('EndActivityInReplyTo', array(&$this, &$xs, $replyNotice));
         }
     }
     $conv = null;
     if (!empty($this->conversation)) {
         $conv = Conversation::staticGet('id', $this->conversation);
     }
     if (Event::handle('StartActivityConversation', array(&$this, &$xs, &$conv))) {
         if (!empty($conv)) {
             $xs->element('link', array('rel' => 'ostatus:conversation', 'href' => $conv->uri));
         }
         Event::handle('EndActivityConversation', array(&$this, &$xs, $conv));
     }
     $replyProfiles = array();
     $reply_ids = $this->getReplies();
     foreach ($reply_ids as $id) {
         $profile = Profile::staticGet('id', $id);
         if (!empty($profile)) {
             $replyProfiles[] = $profile;
         }
     }
     if (Event::handle('StartActivityAttentionProfiles', array(&$this, &$xs, &$replyProfiles))) {
         foreach ($replyProfiles as $profile) {
             $xs->element('link', array('rel' => 'ostatus:attention', 'href' => $profile->getUri()));
             $xs->element('link', array('rel' => 'mentioned', 'href' => $profile->getUri()));
         }
         Event::handle('EndActivityAttentionProfiles', array(&$this, &$xs, $replyProfiles));
     }
     $groups = $this->getGroups();
     if (Event::handle('StartActivityAttentionGroups', array(&$this, &$xs, &$groups))) {
         foreach ($groups as $group) {
             $xs->element('link', array('rel' => 'ostatus:attention', 'href' => $group->permalink()));
             $xs->element('link', array('rel' => 'mentioned', 'href' => $group->permalink()));
         }
         Event::handle('EndActivityAttentionGroups', array(&$this, &$xs, $groups));
     }
     $repeat = null;
     if (!empty($this->repeat_of)) {
         $repeat = Notice::staticGet('id', $this->repeat_of);
     }
     if (Event::handle('StartActivityForward', array(&$this, &$xs, &$repeat))) {
         if (!empty($repeat)) {
             $xs->element('ostatus:forward', array('ref' => $repeat->uri, 'href' => $repeat->bestUrl()));
         }
         Event::handle('EndActivityForward', array(&$this, &$xs, $repeat));
     }
     $tags = $this->getTags();
     if (Event::handle('StartActivityCategories', array(&$this, &$xs, &$tags))) {
         foreach ($tags as $tag) {
             $xs->element('category', array('term' => $tag));
         }
         Event::handle('EndActivityCategories', array(&$this, &$xs, $tags));
     }
     // Enclosures
     $enclosures = array();
     $attachments = $this->attachments();
     foreach ($attachments as $attachment) {
         $enclosure = $attachment->getEnclosure();
         if ($enclosure) {
             $enclosures[] = $enclosure;
         }
     }
     if (Event::handle('StartActivityEnclosures', array(&$this, &$xs, &$enclosures))) {
         foreach ($enclosures as $enclosure) {
             $attributes = array('rel' => 'enclosure', 'href' => $enclosure->url, 'type' => $enclosure->mimetype, 'length' => $enclosure->size);
             if ($enclosure->title) {
                 $attributes['title'] = $enclosure->title;
             }
             $xs->element('link', $attributes, null);
         }
         Event::handle('EndActivityEnclosures', array(&$this, &$xs, $enclosures));
     }
     $lat = $this->lat;
     $lon = $this->lon;
     if (Event::handle('StartActivityGeo', array(&$this, &$xs, &$lat, &$lon))) {
         if (!empty($lat) && !empty($lon)) {
             $xs->element('georss:point', null, $lat . ' ' . $lon);
         }
         Event::handle('EndActivityGeo', array(&$this, &$xs, $lat, $lon));
     }
     if (Event::handle('StartActivityEnd', array(&$this, &$xs))) {
         $xs->elementEnd('entry');
         Event::handle('EndActivityEnd', array(&$this, &$xs));
     }
     return $xs->getString();
 }
Example #6
0
 function asAtomEntry($namespace = false, $source = false, $author = true)
 {
     $profile = $this->getProfile();
     $xs = new XMLStringer(true);
     if ($namespace) {
         $attrs = array('xmlns' => 'http://www.w3.org/2005/Atom', 'xmlns:thr' => 'http://purl.org/syndication/thread/1.0', 'xmlns:georss' => 'http://www.georss.org/georss', 'xmlns:activity' => 'http://activitystrea.ms/spec/1.0/', 'xmlns:media' => 'http://purl.org/syndication/atommedia', 'xmlns:poco' => 'http://portablecontacts.net/spec/1.0', 'xmlns:ostatus' => 'http://ostatus.org/schema/1.0');
     } else {
         $attrs = array();
     }
     $xs->elementStart('entry', $attrs);
     if ($source) {
         $xs->elementStart('source');
         $xs->element('id', null, $profile->profileurl);
         $xs->element('title', null, $profile->nickname . " - " . common_config('site', 'name'));
         $xs->element('link', array('href' => $profile->profileurl));
         $user = User::staticGet('id', $profile->id);
         if (!empty($user)) {
             $atom_feed = common_local_url('ApiTimelineUser', array('format' => 'atom', 'id' => $profile->nickname));
             $xs->element('link', array('rel' => 'self', 'type' => 'application/atom+xml', 'href' => $profile->profileurl));
             $xs->element('link', array('rel' => 'license', 'href' => common_config('license', 'url')));
         }
         $xs->element('icon', null, $profile->avatarUrl(AVATAR_PROFILE_SIZE));
         $xs->element('updated', null, common_date_w3dtf($this->created));
     }
     if ($source) {
         $xs->elementEnd('source');
     }
     $xs->element('title', null, common_xml_safe_str($this->content));
     if ($author) {
         $xs->raw($profile->asAtomAuthor());
         $xs->raw($profile->asActivityActor());
     }
     $xs->element('link', array('rel' => 'alternate', 'type' => 'text/html', 'href' => $this->bestUrl()));
     $xs->element('id', null, $this->uri);
     $xs->element('published', null, common_date_w3dtf($this->created));
     $xs->element('updated', null, common_date_w3dtf($this->created));
     if ($this->reply_to) {
         $reply_notice = Notice::staticGet('id', $this->reply_to);
         if (!empty($reply_notice)) {
             $xs->element('link', array('rel' => 'related', 'href' => $reply_notice->bestUrl()));
             $xs->element('thr:in-reply-to', array('ref' => $reply_notice->uri, 'href' => $reply_notice->bestUrl()));
         }
     }
     if (!empty($this->conversation)) {
         $conv = Conversation::staticGet('id', $this->conversation);
         if (!empty($conv)) {
             $xs->element('link', array('rel' => 'ostatus:conversation', 'href' => $conv->uri));
         }
     }
     $reply_ids = $this->getReplies();
     foreach ($reply_ids as $id) {
         $profile = Profile::staticGet('id', $id);
         if (!empty($profile)) {
             $xs->element('link', array('rel' => 'ostatus:attention', 'href' => $profile->getUri()));
         }
     }
     $groups = $this->getGroups();
     foreach ($groups as $group) {
         $xs->element('link', array('rel' => 'ostatus:attention', 'href' => $group->permalink()));
     }
     if (!empty($this->repeat_of)) {
         $repeat = Notice::staticGet('id', $this->repeat_of);
         if (!empty($repeat)) {
             $xs->element('ostatus:forward', array('ref' => $repeat->uri, 'href' => $repeat->bestUrl()));
         }
     }
     $xs->element('content', array('type' => 'html'), common_xml_safe_str($this->rendered));
     $tag = new Notice_tag();
     $tag->notice_id = $this->id;
     if ($tag->find()) {
         while ($tag->fetch()) {
             $xs->element('category', array('term' => $tag->tag));
         }
     }
     $tag->free();
     # Enclosures
     $attachments = $this->attachments();
     if ($attachments) {
         foreach ($attachments as $attachment) {
             $enclosure = $attachment->getEnclosure();
             if ($enclosure) {
                 $attributes = array('rel' => 'enclosure', 'href' => $enclosure->url, 'type' => $enclosure->mimetype, 'length' => $enclosure->size);
                 if ($enclosure->title) {
                     $attributes['title'] = $enclosure->title;
                 }
                 $xs->element('link', $attributes, null);
             }
         }
     }
     if (!empty($this->lat) && !empty($this->lon)) {
         $xs->element('georss:point', null, $this->lat . ' ' . $this->lon);
     }
     $xs->elementEnd('entry');
     return $xs->getString();
 }
 /**
  * Send a summary email to the user
  *
  * @param mixed $object
  * @return boolean true on success, false on failure
  */
 function handle($user_id)
 {
     // Skip if they've asked not to get summaries
     $ess = Email_summary_status::staticGet('user_id', $user_id);
     if (!empty($ess) && !$ess->send_summary) {
         common_log(LOG_INFO, sprintf('Not sending email summary for user %s by request.', $user_id));
         return true;
     }
     $since_id = null;
     if (!empty($ess)) {
         $since_id = $ess->last_summary_id;
     }
     $user = User::staticGet('id', $user_id);
     if (empty($user)) {
         common_log(LOG_INFO, sprintf('Not sending email summary for user %s; no such user.', $user_id));
         return true;
     }
     if (empty($user->email)) {
         common_log(LOG_INFO, sprintf('Not sending email summary for user %s; no email address.', $user_id));
         return true;
     }
     $profile = $user->getProfile();
     if (empty($profile)) {
         common_log(LOG_WARNING, sprintf('Not sending email summary for user %s; no profile.', $user_id));
         return true;
     }
     $stream = new InboxNoticeStream($user, $user->getProfile());
     $notice = $stream->getNotices(0, self::MAX_NOTICES, $since_id);
     if (empty($notice) || $notice->N == 0) {
         common_log(LOG_WARNING, sprintf('Not sending email summary for user %s; no notices.', $user_id));
         return true;
     }
     // XXX: This is risky fingerpoken in der objektvars, but I didn't feel like
     // figuring out a better way. -ESP
     $new_top = null;
     if ($notice instanceof ArrayWrapper) {
         $new_top = $notice->_items[0]->id;
     }
     // TRANS: Subject for e-mail.
     $subject = sprintf(_m('Your latest updates from %s'), common_config('site', 'name'));
     $out = new XMLStringer(true);
     $out->elementStart('html');
     $out->elementStart('head');
     $out->element('title', null, $subject);
     $out->elementEnd('head');
     $out->elementStart('body');
     $out->elementStart('div', array('width' => '100%', 'style' => 'background-color: #ffffff; border: 4px solid #4c609a; padding: 10px;'));
     $out->elementStart('div', array('style' => 'color: #ffffff; background-color: #4c609a; font-weight: bold; margin-bottom: 10px; padding: 4px;'));
     // TRANS: Text in e-mail summary.
     // TRANS: %1$s is the StatusNet sitename, %2$s is the recipient's profile name.
     $out->raw(sprintf(_m('Recent updates from %1$s for %2$s:'), common_config('site', 'name'), $profile->getBestName()));
     $out->elementEnd('div');
     $out->elementStart('table', array('width' => '550px', 'style' => 'border: none; border-collapse: collapse;', 'cellpadding' => '6'));
     while ($notice->fetch()) {
         $profile = Profile::staticGet('id', $notice->profile_id);
         if (empty($profile)) {
             continue;
         }
         $avatar = $profile->getAvatar(AVATAR_STREAM_SIZE);
         $out->elementStart('tr');
         $out->elementStart('td', array('width' => AVATAR_STREAM_SIZE, 'height' => AVATAR_STREAM_SIZE, 'align' => 'left', 'valign' => 'top', 'style' => 'border-bottom: 1px dotted #C5CEE3; padding: 10px 6px 10px 6px;'));
         $out->element('img', array('src' => $avatar ? $avatar->displayUrl() : Avatar::defaultImage(AVATAR_STREAM_SIZE), 'width' => AVATAR_STREAM_SIZE, 'height' => AVATAR_STREAM_SIZE, 'alt' => $profile->getBestName()));
         $out->elementEnd('td');
         $out->elementStart('td', array('align' => 'left', 'valign' => 'top', 'style' => 'border-bottom: 1px dotted #C5CEE3; padding: 10px 6px 10px 6px;'));
         $out->element('a', array('href' => $profile->profileurl), $profile->nickname);
         $out->text(' ');
         $out->raw($notice->rendered);
         $out->elementStart('div', array('style' => 'font-size: 0.8em; padding-top: 4px;'));
         $noticeurl = $notice->bestUrl();
         // above should always return an URL
         assert(!empty($noticeurl));
         $out->elementStart('a', array('rel' => 'bookmark', 'href' => $noticeurl));
         $dt = common_date_iso8601($notice->created);
         $out->element('abbr', array('style' => 'border-bottom: none;', 'title' => $dt), common_date_string($notice->created));
         $out->elementEnd('a');
         if ($notice->hasConversation()) {
             $conv = Conversation::staticGet('id', $notice->conversation);
             $convurl = $conv->uri;
             if (!empty($convurl)) {
                 $out->text(' ');
                 $out->element('a', array('href' => $convurl . '#notice-' . $notice->id), _m('in context'));
             }
         }
         $out->elementEnd('div');
         $out->elementEnd('td');
         $out->elementEnd('tr');
     }
     $out->elementEnd('table');
     // TRANS: Link text for link to e-mail settings.
     // TRANS: %1$s is a link to the e-mail settings, %2$s is the StatusNet sitename.
     $out->raw("<p>" . sprintf(_m('<a href="%1$s">change your email settings for %2$s</a>'), common_local_url('emailsettings'), common_config('site', 'name')) . "</p>");
     $out->elementEnd('div');
     $out->elementEnd('body');
     $out->elementEnd('html');
     $body = $out->getString();
     // FIXME: do something for people who don't like HTML email
     mail_to_user($user, $subject, $body, array('Content-Type' => 'text/html; charset=utf-8', 'Mime-Version' => '1.0'));
     if (empty($ess)) {
         $ess = new Email_summary_status();
         $ess->user_id = $user_id;
         $ess->created = common_sql_now();
         $ess->last_summary_id = $new_top;
         $ess->modified = common_sql_now();
         $ess->insert();
     } else {
         $orig = clone $ess;
         $ess->last_summary_id = $new_top;
         $ess->modified = common_sql_now();
         $ess->update($orig);
     }
     return true;
 }
Example #8
0
 /**
  * Convert a notice into an activity for export.
  *
  * @param User $cur Current user
  *
  * @return Activity activity object representing this Notice.
  */
 function asActivity($cur)
 {
     $act = self::cacheGet(Cache::codeKey('notice:as-activity:' . $this->id));
     if (!empty($act)) {
         return $act;
     }
     $act = new Activity();
     if (Event::handle('StartNoticeAsActivity', array($this, &$act))) {
         $act->id = TagURI::mint("post:" . $this->id);
         $act->time = strtotime($this->created);
         $act->content = common_xml_safe_str($this->rendered);
         $profile = $this->getProfile();
         $act->actor = ActivityObject::fromProfile($profile);
         $act->actor->extra[] = $profile->profileInfo($cur);
         $act->verb = $this->verb;
         if ($this->repeat_of) {
             $repeated = Notice::staticGet('id', $this->repeat_of);
             if (!empty($repeated)) {
                 $act->objects[] = $repeated->asActivity($cur);
             }
         } else {
             $act->objects[] = ActivityObject::fromNotice($this);
         }
         // XXX: should this be handled by default processing for object entry?
         // Categories
         $tags = $this->getTags();
         foreach ($tags as $tag) {
             $cat = new AtomCategory();
             $cat->term = $tag;
             $act->categories[] = $cat;
         }
         // Enclosures
         // XXX: use Atom Media and/or File activity objects instead
         $attachments = $this->attachments();
         foreach ($attachments as $attachment) {
             // Save local attachments
             if (!empty($attachment->filename)) {
                 $act->attachments[] = ActivityObject::fromFile($attachment);
             }
         }
         $ctx = new ActivityContext();
         if (!empty($this->reply_to)) {
             $reply = Notice::staticGet('id', $this->reply_to);
             if (!empty($reply)) {
                 $ctx->replyToID = $reply->uri;
                 $ctx->replyToUrl = $reply->bestUrl();
             }
         }
         $ctx->location = $this->getLocation();
         $conv = null;
         if (!empty($this->conversation)) {
             $conv = Conversation::staticGet('id', $this->conversation);
             if (!empty($conv)) {
                 $ctx->conversation = $conv->uri;
             }
         }
         $reply_ids = $this->getReplies();
         foreach ($reply_ids as $id) {
             $rprofile = Profile::staticGet('id', $id);
             if (!empty($rprofile)) {
                 $ctx->attention[] = $rprofile->getUri();
                 $ctx->attentionType[$rprofile->getUri()] = ActivityObject::PERSON;
             }
         }
         $groups = $this->getGroups();
         foreach ($groups as $group) {
             $ctx->attention[] = $group->getUri();
             $ctx->attentionType[$group->getUri()] = ActivityObject::GROUP;
         }
         switch ($this->scope) {
             case Notice::PUBLIC_SCOPE:
                 $ctx->attention[] = "http://activityschema.org/collection/public";
                 $ctx->attentionType["http://activityschema.org/collection/public"] = ActivityObject::COLLECTION;
                 break;
             case Notice::FOLLOWER_SCOPE:
                 $surl = common_local_url("subscribers", array('nickname' => $profile->nickname));
                 $ctx->attention[] = $surl;
                 $ctx->attentionType[$surl] = ActivityObject::COLLECTION;
                 break;
         }
         // XXX: deprecated; use ActivityVerb::SHARE instead
         $repeat = null;
         if (!empty($this->repeat_of)) {
             $repeat = Notice::staticGet('id', $this->repeat_of);
             if (!empty($repeat)) {
                 $ctx->forwardID = $repeat->uri;
                 $ctx->forwardUrl = $repeat->bestUrl();
             }
         }
         $act->context = $ctx;
         $source = $this->getSource();
         if ($source) {
             $act->generator = ActivityObject::fromNoticeSource($source);
         }
         // Source
         $atom_feed = $profile->getAtomFeed();
         if (!empty($atom_feed)) {
             $act->source = new ActivitySource();
             // XXX: we should store the actual feed ID
             $act->source->id = $atom_feed;
             // XXX: we should store the actual feed title
             $act->source->title = $profile->getBestName();
             $act->source->links['alternate'] = $profile->profileurl;
             $act->source->links['self'] = $atom_feed;
             $act->source->icon = $profile->avatarUrl(AVATAR_PROFILE_SIZE);
             $notice = $profile->getCurrentNotice();
             if (!empty($notice)) {
                 $act->source->updated = self::utcDate($notice->created);
             }
             $user = User::staticGet('id', $profile->id);
             if (!empty($user)) {
                 $act->source->links['license'] = common_config('license', 'url');
             }
         }
         if ($this->isLocal()) {
             $act->selfLink = common_local_url('ApiStatusesShow', array('id' => $this->id, 'format' => 'atom'));
             $act->editLink = $act->selfLink;
         }
         Event::handle('EndNoticeAsActivity', array($this, &$act));
     }
     self::cacheSet(Cache::codeKey('notice:as-activity:' . $this->id), $act);
     return $act;
 }
 public function testConversationLink()
 {
     $orig = $this->_fakeNotice($this->targetUser1);
     $text = "@" . $this->targetUser1->nickname . " reply text " . common_good_rand(4);
     $reply = Notice::saveNew($this->author1->id, $text, 'test', array('uri' => null, 'reply_to' => $orig->id));
     $conv = Conversation::staticGet('id', $reply->conversation);
     $entry = $reply->asAtomEntry();
     $element = $this->_entryToElement($entry, true);
     $this->assertEquals($conv->uri, ActivityUtils::getLink($element, 'ostatus:conversation'));
 }
Example #10
0
 /**
  * Convert a notice into an activity for export.
  *
  * @param User $cur Current user
  *
  * @return Activity activity object representing this Notice.
  */
 function asActivity($cur)
 {
     $act = self::cacheGet(Cache::codeKey('notice:as-activity:' . $this->id));
     if (!empty($act)) {
         return $act;
     }
     $act = new Activity();
     if (Event::handle('StartNoticeAsActivity', array($this, &$act))) {
         $profile = $this->getProfile();
         $act->actor = ActivityObject::fromProfile($profile);
         $act->actor->extra[] = $profile->profileInfo($cur);
         $act->verb = ActivityVerb::POST;
         $act->objects[] = ActivityObject::fromNotice($this);
         // XXX: should this be handled by default processing for object entry?
         $act->time = strtotime($this->created);
         $act->link = $this->bestUrl();
         $act->content = common_xml_safe_str($this->rendered);
         $act->id = $this->uri;
         $act->title = common_xml_safe_str($this->content);
         // Categories
         $tags = $this->getTags();
         foreach ($tags as $tag) {
             $cat = new AtomCategory();
             $cat->term = $tag;
             $act->categories[] = $cat;
         }
         // Enclosures
         // XXX: use Atom Media and/or File activity objects instead
         $attachments = $this->attachments();
         foreach ($attachments as $attachment) {
             $enclosure = $attachment->getEnclosure();
             if ($enclosure) {
                 $act->enclosures[] = $enclosure;
             }
         }
         $ctx = new ActivityContext();
         if (!empty($this->reply_to)) {
             $reply = Notice::staticGet('id', $this->reply_to);
             if (!empty($reply)) {
                 $ctx->replyToID = $reply->uri;
                 $ctx->replyToUrl = $reply->bestUrl();
             }
         }
         $ctx->location = $this->getLocation();
         $conv = null;
         if (!empty($this->conversation)) {
             $conv = Conversation::staticGet('id', $this->conversation);
             if (!empty($conv)) {
                 $ctx->conversation = $conv->uri;
             }
         }
         $reply_ids = $this->getReplies();
         foreach ($reply_ids as $id) {
             $profile = Profile::staticGet('id', $id);
             if (!empty($profile)) {
                 $ctx->attention[] = $profile->getUri();
             }
         }
         $groups = $this->getGroups();
         foreach ($groups as $group) {
             $ctx->attention[] = $group->getUri();
         }
         // XXX: deprecated; use ActivityVerb::SHARE instead
         $repeat = null;
         if (!empty($this->repeat_of)) {
             $repeat = Notice::staticGet('id', $this->repeat_of);
             $ctx->forwardID = $repeat->uri;
             $ctx->forwardUrl = $repeat->bestUrl();
         }
         $act->context = $ctx;
         // Source
         $atom_feed = $profile->getAtomFeed();
         if (!empty($atom_feed)) {
             $act->source = new ActivitySource();
             // XXX: we should store the actual feed ID
             $act->source->id = $atom_feed;
             // XXX: we should store the actual feed title
             $act->source->title = $profile->getBestName();
             $act->source->links['alternate'] = $profile->profileurl;
             $act->source->links['self'] = $atom_feed;
             $act->source->icon = $profile->avatarUrl(AVATAR_PROFILE_SIZE);
             $notice = $profile->getCurrentNotice();
             if (!empty($notice)) {
                 $act->source->updated = self::utcDate($notice->created);
             }
             $user = User::staticGet('id', $profile->id);
             if (!empty($user)) {
                 $act->source->links['license'] = common_config('license', 'url');
             }
         }
         if ($this->isLocal()) {
             $act->selfLink = common_local_url('ApiStatusesShow', array('id' => $this->id, 'format' => 'atom'));
             $act->editLink = $act->selfLink;
         }
         Event::handle('EndNoticeAsActivity', array($this, &$act));
     }
     self::cacheSet(Cache::codeKey('notice:as-activity:' . $this->id), $act);
     return $act;
 }