Пример #1
0
 /**
  * A webmention to our profile page means someone mentioned us.
  */
 function webmentionContent($source, $target, $source_response, $source_mf2)
 {
     Idno::site()->logging()->info("received user mention from {$source} to {$target}");
     if (empty($this->arguments)) {
         Idno::site()->logging()->debug("could not process user mention, no pagehandler arguments");
         return false;
     }
     $user = User::getByHandle($this->arguments[0]);
     if (empty($user)) {
         Idno::site()->logging()->debug('could not process user mention, no user for handle ' . $this->arguments[0]);
         return false;
     }
     Idno::site()->logging()->debug("found target user {$user->getHandle()}");
     // if this is anything other than a normal mention (e.g. a delete), accept the wm, but do nothing
     if ($source_response['response'] !== 200) {
         return true;
     }
     $title = Webmention::getTitleFromContent($source_response['content'], $source);
     $mention = ['permalink' => $source, 'title' => $title];
     // look for the first and only h-entry or h-event on the page
     $entry = Webmention::findRepresentativeHEntry($source_mf2, $source, ['h-entry', 'h-event']);
     $card = Webmention::findAuthorHCard($source_mf2, $source, $entry);
     // try to get some more specific details of the mention from mf2 content
     if ($entry) {
         if (!empty($entry['properties']['url'])) {
             $mention['permalink'] = $entry['properties']['url'][0];
         }
         if (!empty($entry['properties']['content'])) {
             $content = $entry['properties']['content'][0];
             $mention['content'] = Idno::site()->template()->sanitize_html(is_array($content) ? $content['html'] : $content);
         }
     }
     $sender_url = false;
     if ($card) {
         if (!empty($card['properties']['url'])) {
             $sender_url = $card['properties']['url'][0];
             $mention['owner_url'] = $card['properties']['url'][0];
         }
         if (!empty($card['properties']['name'])) {
             $mention['owner_name'] = $card['properties']['name'][0];
         }
     }
     $message = 'You were mentioned';
     if (isset($mention['owner_name'])) {
         $message .= ' by ' . $mention['owner_name'];
     }
     $message .= ' on ' . parse_url($mention['permalink'], PHP_URL_HOST);
     $notif = new Notification();
     if ($notif->setNotificationKey(['mention', $user->getUUID(), $source, $target])) {
         $notif->setOwner($user);
         $notif->setMessage($message);
         $notif->setMessageTemplate('content/notification/mention');
         $notif->setActor($sender_url);
         $notif->setVerb('mention');
         $notif->setObject($mention);
         $notif->setTarget($user);
         $notif->save();
         $user->notify($notif);
     } else {
         \Idno\Core\Idno::site()->logging()->debug("ignoring duplicate notification", ['source' => $source, 'target' => $target, 'user' => $user->getHandle()]);
     }
     return true;
 }
Пример #2
0
 /**
  * Add webmentions as annotations based on Microformats 2 data
  *
  * @param string $source The source URL
  * @param string $target The target URL (i.e., the page on this site that was pinged)
  * @param array $source_response The Webservice response from fetching the source page
  * @param array $source_mf2 Parsed Microformats 2 content from $source
  * @return bool Success
  */
 function addWebmentions($source, $target, $source_response, $source_mf2)
 {
     if ($source_response['response'] == 410) {
         $this->removeAnnotation($source);
         $this->save();
         return true;
     }
     $return = false;
     if (!empty($source_mf2) && !empty($source_mf2['items']) && is_array($source_mf2['items'])) {
         // At this point, we don't know who owns the page or what the content is.
         // First, we'll initialize some variables that we're interested in filling.
         $mentions = array('owner' => array(), 'mentions' => array());
         // Content owner and usable webmention items
         // Get the page title from the source content
         $title = Webmention::getTitleFromContent($source_response['content'], $source);
         // primary h-entry on the page
         $primary = Webmention::findRepresentativeHEntry($source_mf2, $source, ['h-entry']);
         $author = Webmention::findAuthorHCard($source_mf2, $source, $primary);
         // Convert the h-entry to one or more mentions
         if ($primary) {
             $mentions = $this->addWebmentionItem($primary, $author, $mentions, $source, $target, $title);
         }
         if (!empty($mentions['mentions']) && !empty($mentions['owner'])) {
             $return = true;
             if (empty($mentions['owner']['photo'])) {
                 $mentions['owner']['photo'] = '';
             }
             if (empty($mentions['owner']['url'])) {
                 $mentions['owner']['url'] = $source;
             }
             if (empty($mentions['owner']['name'])) {
                 $mentions['owner']['name'] = 'Web user';
             }
             if (empty($mentions['title'])) {
                 $mentions['title'] = '';
             }
             $this->removeAnnotation($source);
             foreach ($mentions['mentions'] as $mention) {
                 if (!empty($mention['url'])) {
                     $permalink = $mention['url'][0];
                     //implode('', $mention['url']);
                 } else {
                     $permalink = $source;
                 }
                 // Special exemption for bridgy
                 if (strpos($source, 'https://brid-gy.appspot.com/') !== false && in_array($mention['type'], array('like', 'share', 'rsvp'))) {
                     $permalink = \Idno\Core\Idno::site()->template()->getURLWithVar('known_from', $source, implode('', $mention['url']));
                 }
                 if (!$this->addAnnotation($mention['type'], $mentions['owner']['name'], $mentions['owner']['url'], $mentions['owner']['photo'], $mention['content'], $permalink, $mention['created'], $mention['title'])) {
                     $return = false;
                 }
             }
             $this->save();
             if ($return && $this->isReply()) {
                 if ($reply_urls = $this->getReplyToURLs()) {
                     foreach ($reply_urls as $reply_url) {
                         Webmention::sendWebmentionPayload($this->getDisplayURL(), $reply_url);
                     }
                 }
             }
         }
     }
     return $return;
 }