X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=classes%2FNotice.php;h=e46ed227a179cbb4cd4f9119a2b2bcb4a7e13ffd;hb=132be9950662ce0d5a1e859a766232cd7fdcb0e1;hp=808de55c2e0fbd93de26657d565ba2c042f17e6d;hpb=00db57949fe3e26fd82fb710cdba288a72937e3f;p=quix0rs-gnu-social.git diff --git a/classes/Notice.php b/classes/Notice.php index 808de55c2e..e46ed227a1 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -194,8 +194,8 @@ class Notice extends Managed_DataObject $this->clearTags(); $this->clearGroupInboxes(); $this->clearFiles(); + $this->clearAttentions(); - // NOTE: we don't clear inboxes // NOTE: we don't clear queue items } @@ -213,7 +213,25 @@ class Notice extends Managed_DataObject public function getUrl() { // The risk is we start having empty urls and non-http uris... - return $this->url ?: $this->uri; + // and we can't really handle any other protocol right now. + switch (true) { + case common_valid_http_url($this->url): // should we allow non-http/https URLs? + return $this->url; + case $this->isLocal(): + // let's generate a valid link to our locally available notice on demand + return common_local_url('shownotice', array('notice' => $this->id), null, null, false); + case common_valid_http_url($this->uri): + return $this->uri; + default: + common_debug('No URL available for notice: id='.$this->id); + throw new InvalidUrlException($this->url); + } + } + + public function get_object_type($canonical=false) { + return $canonical + ? ActivityObject::canonicalType($this->object_type) + : $this->object_type; } public static function getByUri($uri) @@ -308,7 +326,7 @@ class Notice extends Managed_DataObject * int 'location_ns' geoname namespace to interpret location_id * int 'reply_to'; notice ID this is a reply to * int 'repeat_of'; notice ID this is a repeat of - * string 'uri' unique ID for notice; defaults to local notice URL + * string 'uri' unique ID for notice; a unique tag uri (can be url or anything too) * string 'url' permalink to notice; defaults to local notice URL * string 'rendered' rendered HTML version of content * array 'replies' list of profile URIs for reply delivery in @@ -410,6 +428,16 @@ class Notice extends Managed_DataObject $notice->created = common_sql_now(); } + if (!$notice->isLocal()) { + // Only do these checks for non-local notices. Local notices will generate these values later. + if (!common_valid_http_url($url)) { + common_debug('Bad notice URL: ['.$url.'], URI: ['.$uri.']. Cannot link back to original! This is normal for shared notices etc.'); + } + if (empty($uri)) { + throw new ServerException('No URI for remote notice. Cannot accept that.'); + } + } + $notice->content = $final; $notice->source = $source; @@ -578,8 +606,13 @@ class Notice extends Managed_DataObject $changed = false; - if (empty($uri)) { - $notice->uri = common_notice_uri($notice); + // We can only get here if it's a local notice, since remote notices + // should've bailed out earlier due to lacking a URI. + if (empty($notice->uri)) { + $notice->uri = sprintf('%s%s=%d:%s=%s', + TagURI::mint(), + 'noticeId', $notice->id, + 'objectType', $notice->get_object_type(true)); $changed = true; } @@ -979,30 +1012,23 @@ class Notice extends Managed_DataObject } } - if (is_null($groups)) { - $groups = $this->getGroups(); - } - if (is_null($recipients)) { $recipients = $this->getReplies(); } - $users = $this->getSubscribedUsers(); - $ptags = $this->getProfileTags(); - - // FIXME: kind of ignoring 'transitional'... - // we'll probably stop supporting inboxless mode - // in 0.9.x - $ni = array(); // Give plugins a chance to add folks in at start... if (Event::handle('StartNoticeWhoGets', array($this, &$ni))) { + $users = $this->getSubscribedUsers(); foreach ($users as $id) { $ni[$id] = NOTICE_INBOX_SOURCE_SUB; } + if (is_null($groups)) { + $groups = $this->getGroups(); + } foreach ($groups as $group) { $users = $group->getUserMembers(); foreach ($users as $id) { @@ -1012,12 +1038,10 @@ class Notice extends Managed_DataObject } } - foreach ($ptags as $ptag) { - $users = $ptag->getUserSubscribers(); - foreach ($users as $id) { - if (!array_key_exists($id, $ni)) { - $ni[$id] = NOTICE_INBOX_SOURCE_PROFILE_TAG; - } + $ptAtts = $this->getAttentionsFromProfileTags(); + foreach ($ptAtts as $key=>$val) { + if (!array_key_exists($key, $ni)) { + $ni[$key] = $val; } } @@ -1064,43 +1088,6 @@ class Notice extends Managed_DataObject return $ni; } - /** - * Adds this notice to the inboxes of each local user who should receive - * it, based on author subscriptions, group memberships, and @-replies. - * - * Warning: running a second time currently will make items appear - * multiple times in users' inboxes. - * - * @fixme make more robust against errors - * @fixme break up massive deliveries to smaller background tasks - * - * @param array $groups optional list of Group objects; - * if left empty, will be loaded from group_inbox records - * @param array $recipient optional list of reply profile ids - * if left empty, will be loaded from reply records - */ - function addToInboxes(array $groups=null, array $recipients=null) - { - $ni = $this->whoGets($groups, $recipients); - - $ids = array_keys($ni); - - // We remove the author (if they're a local user), - // since we'll have already done this in distribute() - - $i = array_search($this->profile_id, $ids); - - if ($i !== false) { - unset($ids[$i]); - } - - // Bulk insert - - Inbox::bulkInsert($this, $ids); - - return; - } - function getSubscribedUsers() { $user = new User(); @@ -1141,6 +1128,19 @@ class Notice extends Managed_DataObject return $ptags; } + public function getAttentionsFromProfileTags() + { + $ni = array(); + $ptags = $this->getProfileTags(); + foreach ($ptags as $ptag) { + $users = $ptag->getUserSubscribers(); + foreach ($users as $id) { + $ni[$id] = NOTICE_INBOX_SOURCE_PROFILE_TAG; + } + } + return $ni; + } + /** * Record this notice to the given group inboxes for delivery. * Overrides the regular parsing of !group markup. @@ -1947,6 +1947,20 @@ class Notice extends Managed_DataObject return $options; } + function clearAttentions() + { + $att = new Attention(); + $att->notice_id = $this->getID(); + + if ($att->find()) { + while ($att->fetch()) { + // Can't do delete() on the object directly since it won't remove all of it + $other = clone($att); + $other->delete(); + } + } + } + function clearReplies() { $replyNotice = new Notice(); @@ -2066,11 +2080,6 @@ class Notice extends Managed_DataObject // have to wait Event::handle('StartNoticeDistribute', array($this)); - $user = User::getKV('id', $this->profile_id); - if ($user instanceof User) { - Inbox::insertNotice($this, $user->id); - } - // If there's a failure, we want to _force_ // distribution at this point. try {